python.3 setter中的无限递归

时间:2015-04-09 13:11:45

标签: python python-3.x properties

有人可以告诉我为什么在下面的代码中有一个递归?

class A:

    def __init__(self):
        self.a = 0

    @property
    def a(self):
        print ("called a getter")
        return self.a

    @a.setter
    def a(self, value):
        print ("called a setter")
        self.a = value


class B(A):

    def check(self):
        a = 10


if __name__ == "__main__":
    bb = B()
    bb.check()

我必须从子类调用基类setter。我不被允许直接访问该成员。有人可以告诉我怎么做其他方式吗?

1 个答案:

答案 0 :(得分:6)

@a.setter
def a(self, value):
    print ("called a setter")
    self.a = value

执行self.a = value时,会再次调用您的方法a(self, value),再次执行self.a = value,调用a(self, value)等等。

传统解决方案是为属性和基础属性指定不同的名称。防爆。你可以在前面添加一个下划线。

class A:

    def __init__(self):
        self._a = 0

    @property
    def a(self):
        print ("called a getter")
        return self._a

    @a.setter
    def a(self, value):
        print ("called a setter")
        self._a = value