从python中动态添加的方法访问对象成员



使用动态生成的方法共享类的成员时遇到问题。

例如,从__init__normal_test访问的下面的x与从动态有界方法testsetx访问的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)时,它实际上将fclass(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

您不应该将@classmethodself一起使用,因为它指向您的类实例,而在@classmethod中,您应该使用cls,因为它指的是整个类。

请看这里:@classmethod和@staticmethod对初学者的意义?


因此,最简单的解决方案就是删除classmethod:

setattr(Foo, "test", bar)
setattr(Foo, "setx", setx_method)

相关内容

  • 没有找到相关文章

最新更新