python - 属性是否支持继承?

标签 python inheritance properties

在我的代码中,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/

相关文章:

c# - 在泛型类 C# 中继承

java - 无法使用 @PropertySource 将 .properties 文件注入(inject) Spring MVC 4.3

javascript - 作为 css 选择器的 polymer 属性不起作用

python - 从 cli 字符串输出中识别键和值的算法

python - 从 csv 打印时出现 IndexError

python - Masonite 中的 login_required() 相当于什么?

java - java中的 "extends"和 "implements"在性能和内存等方面有什么区别

python - 类似于 simplejson/json 的 XML 库? - Python

inheritance - 从React中的父类(super class)继承defaultProps

objective-c - Objective-C中的ivars和属性有什么区别