群里有人問如何做到
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怎么辦.基本只能跑一遍代碼才能正確解析了....
