我现在的位置是这样的:
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
的值。此代码的想法是创建一个看起来像 A
的 C
类(就 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/