我用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)
创建实例时。我该如何解决?
答案 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
添加此内容后,重新运行代码,您将注意到打印输出。一旦高兴,您就可以删除该打印行。