给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并不存在, 所以无法这么做.
 
 

评论关闭