给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怎么办.基本只能跑一遍代码才能正确解析了....

 

 

给python类动态添加方法(method),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。