我在使用动态生成的方法共享类的成员时遇到问题。
例如,从x
和__init__
访问的normal_test
下方与动态有界方法x
和test
访问的setx
不同:
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
?
答案 0 :(得分:1)
分析
setattr(Foo, "setx", classmethod(setx_method))
它相当于
@classmethod
def setx_method(self,x):
self.x=x
现在,当您调用f.setx(5)
时,它实际上将f
class(ie, Foo)
与自我绑定,将5与x
绑定,从而执行Foo.x = 5
简而言之,x
中有两个Foo
,一个是实例成员x
,另一个是类成员x
。
f.setx(5) # sets class x
f.test() # print class variable x
f.normal_test() # print instance variable x
答案 1 :(得分:0)
您不应该将@classmethod
与self
一起使用,因为它指向您的班级实例,而在@classmethod
中您应该使用cls
因为它指向整个班级。
见这里:Meaning of @classmethod and @staticmethod for beginner?
所以最简单的解决方案就是删除classmethod
:
setattr(Foo, "test", bar)
setattr(Foo, "setx", setx_method)