AttributeError:不能设置初始化子类时发生的属性错误

时间:2018-12-23 16:41:02

标签: python python-3.x

我用python 3.6编写了以下代码。

x_out

发生使用类B class A: def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2 @property def p1(self): return self._p1 @p1.setter def p1(self, p1): self._p1 = p1 @property def p2(self): return self._p2 @p2.setter def p2(self, p2): self._p2 = p2 class B(A): def __init__(self, p1, p2, p3): super(B, self).__init__(p1, p2) self.p3 = p3 @property def p1(self): return self._p1 if self.p3 is None else self._p1+1 @property def p3(self): return self._p3 @p3.setter def p3(self, p3): self._p3 = p3 b1 = B(1,2,3) 创建实例时。我该如何解决?

3 个答案:

答案 0 :(得分:2)

您还需要为B类定义@ p1.setter

class A:
    def __init__(self, p1, p2):
        self.p1 = p1
        self.p2 = p2

    @property
    def p1(self):
        return self._p1
    @p1.setter
    def p1(self, p1):
        self._p1 = p1

    @property
    def p2(self):
        return self._p2
    @p2.setter
    def p2(self, p2):
        self._p2 = p2

class B(A):
    def __init__(self, p1, p2, p3):
        super(B, self).__init__(p1, p2)
        self.p3 = p3

    @property
    def p1(self):
        return self._p1 if self.p3 is None else self._p1+1

    @p1.setter
    def p1(self, p1):
        self._p1 = p1

    @property
    def p3(self):
        return self._p3
    @p3.setter
    def p3(self, p3):
        self._p3 = p3

b1 = B(1, 2, 3)
b2 = B(1, 2, None)

print(b1.p1)
print(b2.p1)

输出

2
1

答案 1 :(得分:2)

问题在于,在B中,您覆盖了整个属性p1,而不仅仅是具有相同名称的A属性的获取器。您需要明确提供设置器。

class B(A):
    ...

    # Not sure if there is a better method than
    # simply copying this from A. (At least,
    # not without creating your own custom property
    # descriptor that supports inheritance.)
    @p1.setter
    def p1(self, x):
        self._p1 = x

答案 2 :(得分:1)

问题出在B类中,您只有p1的属性,而没有二传手。这使p1成为只读属性。在A类中,位于以下行:

    self.p1 = p1

您将获得AttributeError,因为您试图覆盖只读属性。解决方法是为B类添加设置器:

@p1.setter
def p1(self, p1):
    print('Setting B.p1 = {}'.format(p1))
    self._p1 = p1

添加此内容后,重新运行代码,您将注意到打印输出。一旦高兴,您就可以删除该打印行。