我在添加属性时尝试继承 python 类时遇到问题。为了说明这一点,定义以下类:
class A:
def __init__(self, prop, x1, x2):
self.prop = prop
self.x = x1 + x2
class B(A):
def __init__(self, prop, x1, x2):
super().__init__(prop, x1, x2)
@property
def prop(self):
return self._prop
@prop.setter
def prop(self, value):
self._prop = value + 10
现在类B
想要调用类A
的__init__
方法,该方法将调用B.prop
的二传手。但我不想这样做,而是想直接设置 _prop
。有什么好的方法可以实现这一点吗?
以下是我通过尝试检测我们是否处于 __init__
中而提出的解决方案,但我想听听一些替代方案。
class B(A):
def __init__(self, prop, x1, x2):
super().__init__(prop, x1, x2)
@property
def prop(self):
return self._prop
@prop.setter
def prop(self, value):
if hasattr(self, '_prop'):
self._prop = value + 10
else:
self._prop = value
您似乎正在寻找一种将子类 B
的实现细节公开给父类 A.__init__
的方法的方法。我认为这是一种反模式,而不是理想的模式。
如果父类的__init__
(设置self.prop
)的行为与子类的实现不兼容,那么你应该重写 __init__
在子类中,以免调用 super().__init__
。
我同意Jon Clements' comment 。您的代码的目标到底是什么?通常,创建一个类来封装一些有用的行为。当子类大量借鉴父类的行为并且可以在不过多修改父类内部的情况下实现这一点时,从该类继承是有意义的。
我是一名优秀的程序员,十分优秀!