在我的代码类A
中有一个属性,但类B
不会继承它。 @property
是否支持继承?还是我的错?
class A(object):
def __init__(self):
self._x = 100
@property
def x(self):
return self._x
@x.setter
def x(self, v):
self._x = v
class B(A):
@x.setter
def x(self, v):
self._x = v
错误信息如下:
Traceback (most recent call last):
File "test.py", line 9, in <module>
class B(A):
File "test.py", line 10, in B
@x.setter
NameError: name 'x' is not defined
答案 0 :(得分:4)
NameError
是因为x
不在全球范围内;它是在A
的类名称空间中定义的,因此您需要使用A.x
显式访问它。这是一个非常常见的错误,例如, python subclass access to class variable of parent
但是,对于属性,它可能会稍微复杂一些。如果您在B
中添加新的setter ,那么A.x.setter
中使用A
就没有问题。但是,如果覆盖现有的setter ,则还会改变A
的行为。我怀疑这是你想要的行为。
相反,在这种情况下,您需要在子类中使用class B(A):
x = property(A.x.__get__) # new property with same getter
@x.setter # new setter on new property
def x(self, v):
...
的getter和新的setter创建一个新属性。我认为这是实现这一目标的最简单方法,重复次数最少:
property
请注意@
没有A
句法糖的用法,因为我没有使用它来装饰新方法。如果您想从B
的setter访问super().x.__set__(whatever)
的setter,可以使用__m256
进行设置。
答案 1 :(得分:2)
它只是不知道从哪里获取x
。你可以这样做:
class A(object):
def __init__(self):
self._x = 100
@property
def x(self):
return self._x
class B(A):
@A.x.setter
def x(self, v):
self._x = v