Python 属性错误:can';初始化子类时发生t set属性错误

Python 属性错误:can';初始化子类时发生t set属性错误,python,python-3.x,Python,Python 3.x,我用python 3.6编写了以下代码 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)

我用python 3.6编写了以下代码

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)

使用类B创建实例时发生“AttributeError:无法设置属性”。如何修复它?

您还需要为类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

您还需要为类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

问题在B类中,您只有
p1
的属性,没有setter。这使得
p1
成为只读属性。在A级,在生产线上:

    self.p1 = p1
您将获得
AttributeError
,因为您正试图覆盖只读属性。修复方法是为类B添加一个setter:

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

通过此添加,重新运行代码,您将注意到打印输出。一旦满意,您就可以删除该打印行。

问题出在B类中,您只有
p1
的属性,没有设置器。这使得
p1
成为只读属性。在A级,在生产线上:

    self.p1 = p1
您将获得
AttributeError
,因为您正试图覆盖只读属性。修复方法是为类B添加一个setter:

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

通过此添加,重新运行代码,您将注意到打印输出。一旦满意,您就可以删除该打印行。

问题是在
B
中,您覆盖了整个属性
p1
,而不仅仅是同名的
A
属性的getter。您需要显式地提供setter

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

问题是在
B
中,您覆盖了整个属性
p1
,而不仅仅是同名的
A
属性的getter。您需要显式地提供setter

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

在我看来,你的
self.p1=p1
应该是
self.\u p1=p1
谁把这个问题标记为结束?问题是可重复的,代码在中是完整的itself@ycx不,那不是问题(虽然在
A
自己的方法中,为了效率而打破抽象可能是可以的。@切普纳感谢你给我的提示,比如你的
self.p1=p1
应该是
self。_p1=p1
谁把这个问题标记为结束?这个问题是可以重现的,代码在itself@ycx不,那不是问题(虽然在
A
自己的方法中,为了效率而打破抽象可能是可以的。@chepner谢谢你的提示