Python将setter重写为没有setter的属性?

时间:2014-04-25 08:16:18

标签: python inheritance python-3.x properties getter-setter

我有一个由其他人制作的课程A,我无法编辑:

class A:
    def __init__(self, x):
        self.x = x

现在我正在尝试从B继承自己的班级A,并将x作为属性而不是属性。 这可能吗?

我已经尝试过:

class B(A):
    def __init__(self, x):
        super().__init__(x)

    @property
    def x(self):
        return super().x

    @x.setter
    def x(self, x):
        super().x = x
        print(x)  # my stuff goes here

但正如我所料,这是不可能的:AttributeError: 'super' object has no attribute 'x'

还有其他方法吗,有些可能会工作吗?

1 个答案:

答案 0 :(得分:1)

不,您不能将super()用于除类属性之外的任何内容; x实例属性,并且没有属性的继承机制。

实例属性存在于单个命名空间中;没有'父实例'属性名称空间。

您仍然可以在实例__dict__对象中找到该属性:

class B(A):
    @property
    def x(self):
        return self.__dict__['x']

    @x.setter
    def x(self, x):
        self.__dict__['x'] = x
        print(x)  # my stuff goes here

属性是数据描述符,这意味着在查询实例属性之前会查找它(请参阅descriptor howto),但您仍然可以直接访问它。