在我的代码中,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
最佳答案
NameError
是因为x
不在全局范围内;它是在 A
的类命名空间中定义的,因此您需要使用 A.x
显式访问它。这是一个很常见的错误,参见例如python subclass access to class variable of parent .
但是,对于属性,它可能会稍微复杂一些。如果您在 B
中添加一个新的 setter,那么使用 A.x.setter
就没有问题,如 Dean's answer 所示。 .但是,如果您覆盖现有的 setter,您也会改变 A
这样做的行为。我怀疑这是您想要的行为。
相反,在这种情况下,您需要使用 A
的 getter 和一个新的 setter 在子类中创建一个新属性。我认为这是实现该目标的最简单方法,重复次数最少:
class B(A):
x = property(A.x.__get__) # new property with same getter
@x.setter # new setter on new property
def x(self, v):
...
请注意 property
的使用没有 @
语法糖,因为我没有使用它来修饰新方法。如果你想从 B
的 setter 访问 A
的 setter,你可以使用 super().x.__set__(whatever)
.
关于python - 属性是否支持继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38301453/