首页 > 代码库 > 给python类动态添加方法(method)
给python类动态添加方法(method)
群里有人问如何做到
def foo(): passclass Bar(object): passBar.set_instance_method(foo)b = Bar()b.foo()
这个其实还是比较简单的, 只要写个函数给类设置属性即可, 可根据需求是否用函数包装下, 或者用staticmethod这个decorator:
import functoolsdef 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.fooprint Bar.foo
输出
hello world<bound method Bar.foo of <__main__.Bar object at 0x10d41c890>><unbound method Bar.foo>
然后又问如果要这样做怎么写:
def foo(): passclass Bar(object): set_instance_method(foo)
这样问题就在于set_instance_method运行时如何获得类(Bar), 无奈, 尝试了下,最多也只能得到"Bar"(通过inspect模块).
不是很熟悉python内部原理, 只知道在Bar定义时Bar并不存在, 所以无法这么做.
不过不太清楚问问题的人思路是怎么样的, 如果纯粹是为了研究倒也还好.
如果把代码写成这样, 觉得没什么太多好处, 再加上可能增加了维护成本, 导致维护的人找不到函数的定义.
再者, 你让IDE怎么办.基本只能跑一遍代码才能正确解析了....
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。