給python類動態添加方法(method)


群里有人問如何做到

def foo():
    pass

class Bar(object):
    pass

Bar.set_instance_method(foo)

b = Bar()
b.foo()

這個其實還是比較簡單的, 只要寫個函數給類設置屬性即可, 可根據需求是否用函數包裝下, 或者用staticmethod這個decorator:

import functools


def foo():
    print 'hello world'


class Bar(object):
    def __init__(self):
        self.data = 42

    @classmethod
    def set_instance_method(cls, func):
        @functools.wraps(func)
        def dummy(self, *args, **kwargs):
            func(*args, **kwargs)
        setattr(cls, func.func_name, dummy)

Bar.set_instance_method(foo)


b = Bar()
b.foo()
print b.foo
print Bar.foo

輸出

hello world
<bound method Bar.foo of <__main__.Bar object at 0x10d41c890>>
<unbound method Bar.foo>

 

然后又問如果要這樣做怎么寫:

def foo():
    pass

class Bar(object):
    set_instance_method(foo)

這樣問題就在於set_instance_method運行時如何獲得類(Bar), 無奈, 嘗試了下,最多也只能得到"Bar"(通過inspect模塊).
不是很熟悉python內部原理, 只知道在Bar定義時Bar並不存在, 所以無法這么做.

 

不過不太清楚問問題的人思路是怎么樣的, 如果純粹是為了研究倒也還好.
如果把代碼寫成這樣, 覺得沒什么太多好處, 再加上可能增加了維護成本, 導致維護的人找不到函數的定義.

再者, 你讓IDE怎么辦.基本只能跑一遍代碼才能正確解析了....

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM