我现在的样子如下:
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
。在其他情况下,我想使用更复杂的方法,该方法涉及根据组织成A.x
的信息计算B
的值。此代码中的想法是创建一个C
类,它看起来像A
(就x
字段而言),但不需要手工设置该字段值相反,它只是派生出来。
我无法弄清楚如何以合理的方式让C.x
属性影响A.x
字段。
答案 0 :(得分:2)
self.x = val
方法中的行A.__init__
只会调用您的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