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