假设我有一个课程Foo
,而我却是foo = Foo()
。我想要一种在foo.bar
实例之间不共享的“方法命名空间” Foo
,我可以动态地向其添加可以在foo
上操作的方法:
def method(self, someValue):
self.value = someValue + 10
foo.bar.m = method
foo.bar.m(20)
然后我想找到
foo.value
是30。有什么办法做到这一点?
最佳答案
这是您要找的东西吗?
import types
class Namespace(object):
pass
class Foo(object):
def __init__(self, value):
self.value = value
self.bar = Namespace()
def function(self, new_value):
self.value = new_value
a = Foo(1)
b = Foo(2)
b.bar.function = types.MethodType(function, b, Foo)
b.bar.function(6)
print a.value # prints 1
print b.value # prints 6
技巧是使用
types
模块将测试函数转换为可以绑定到对象实例的方法。当我运行以下代码行:
b.bar.function = types.MethodType(function, b, Foo)
时,我实际上是在告诉Python创建一个将function
绑定到b
的Foo
实例的新方法。然后,我可以采用这种方法并将其存储在任意位置。由于该方法永久绑定到
b
的Foo
实例,因此self
始终引用b
,无论该方法实际分配给哪个对象。关于python - Python类中的方法 namespace /集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21960793/