假设我有一个课程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绑定到bFoo实例的新方法。然后,我可以采用这种方法并将其存储在任意位置。

由于该方法永久绑定到bFoo实例,因此self始终引用b,无论该方法实际分配给哪个对象。

关于python - Python类中的方法 namespace /集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21960793/

10-11 23:01
查看更多