python3.3 setter中的无限递归

asi*_*hal 1 python properties python-3.x

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

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()
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*vin 6

@a.setter
def a(self, value):
    print ("called a setter")
    self.a = value
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)