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

时间:2015-11-09 08:22:21

标签: python reflection metaprogramming

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

例如,从x__init__访问的normal_test下方与动态有界方法xtest访问的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

2 个答案:

答案 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)

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

见这里:Meaning of @classmethod and @staticmethod for beginner?

所以最简单的解决方案就是删除classmethod

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