python - 使用子类中的属性覆盖父类中的字段

标签 python python-2.7 inheritance properties

我现在的位置是这样的:

class A(object):
    def __init__(self, val):
        self.x=val
        self.y=42
        # other fields

class B(object):
    def __init__(self):
        self.a=22
        # other fields

class C(A,B):
    def __init__(self, val):
        super(C,self).__init__(val)
    @property
    def x(self):
        # if A.x is None return a value that I can compute from A.y and B.a
        # if A.x is not None return it
    @x.setter
    def x(self, val):
        # set the field value

有时我只想手动设置 x 的假定值,在这种情况下我只需使用 A。在其他情况下,我想使用更复杂的方法,包括根据组织到 B 中的信息计算 A.x 的值。此代码的想法是创建一个看起来像 AC 类(就 x 字段而言),但并不需要手动设置该字段值,而不是直接导出它。

我不知道如何让 C.x 属性以合理的方式隐藏 A.x 字段。

最佳答案

A.__init__ 方法中的 self.x = val 行将简单地调用您的 C.x setter 。您已经在这里处理了所有事情。您在这里处理每个实例属性,而不是由子类继承的类上的属性。

您需要做的就是在 setter 中设置一个不同属性来表示 x 值。您可以将其命名为 _x,例如:

class C(A, B):
    _x = None

    @property
    def x(self):
        if self._x is not None:
            return self._x
        return self.a + self.y

    @x.setter
    def x(self, val):
        self._x = val

请注意,如果 C.__init__ 所做的只是调用 super().__init__,那么您根本不需要它。但是,您确实需要确保至少A.__init__()在继承结构中发挥作用;添加更多对 super().__init__() 的调用:

class A(object):
    def __init__(self, val, *args, **kwargs):
        super(A, self).__init__(*args, **kwargs)
        self.x = val
        self.y = 42

class B(object):
    def __init__(self, *args, **kwargs):
        super(B, self).__init__(*args, **kwargs)
        self.a = 22

使用*args**kwargs允许这些方法将任何额外的参数传递给层次结构中的其他类。

演示,使用上述类:

>>> c = C(None)
>>> c.x
64
>>> c.x = 15
>>> c.x
15

关于python - 使用子类中的属性覆盖父类中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37757037/

相关文章:

python - 我的 c 应用程序的 GUI 开发。如何进行?

python - 我是否针对 Keras 中的 LSTM 优化了输入数据的格式?

python-2.7 - 奇怪的迭代结果 "error is nan"和使用 t-SNE 的 RuntimeWarning

C++:设计建议

c++ - 为什么我必须通过this指针访问模板基类成员?

python - 找到: missing argument to `-exec' when using subprocess

python tkinter 如何将键绑定(bind)到按钮

python - 如何从命令行获取python安装路径

javascript - 使用下划线继承

python - 带有 Python 库的小波图