使用动态生成的方法共享类的成员时遇到问题。
例如,从__init__
和normal_test
访问的下面的x
与从动态有界方法test
和setx
访问的x
不同:
class Foo:
def __init__(self):
self.x = 10
def normal_test(self):
print self.x
def bar(self):
print self.x
def setx_method(self,x):
self.x = x
setattr(Foo, "test", classmethod(bar))
setattr(Foo, "setx", classmethod(setx_method))
f = Foo();
f.setx(5)
f.test()
f.normal_test()
我应该如何编写代码,使self.x
引用相同的x
?
分析
setattr(Foo, "setx", classmethod(setx_method))
它相当于
@classmethod
def setx_method(self,x):
self.x=x
现在,当您调用f.setx(5)
时,它实际上将f
的class(ie, Foo)
与self绑定,将5与x
绑定,从而执行Foo.x = 5
简而言之,Foo
中有两个x
,一个是实例成员x
,另一个是类成员x
。
f.setx(5) # sets class x
f.test() # print class variable x
f.normal_test() # print instance variable x
您不应该将@classmethod
与self
一起使用,因为它指向您的类实例,而在@classmethod
中,您应该使用cls
,因为它指的是整个类。
请看这里:@classmethod和@staticmethod对初学者的意义?
因此,最简单的解决方案就是删除classmethod
:
setattr(Foo, "test", bar)
setattr(Foo, "setx", setx_method)