这是我画过几次的角落。考虑到 Python 中备用构造函数的常见程度,我会认为从其超类的备用构造函数构造子类并非闻所未闻,但我想不出如何做到这一点或在网上找到关于它的讨论。
来说明问题。假设我有以下玩具超类。
class Parent:
def __init__(self):
self.x = 0
@classmethod
def from_x(cls, x):
a = cls()
a.x = x
return a
现在说我想Parent
使用它的from_x
方法进行子类化。我能想到四个不满意的解决方案。
__init__
如下所示在子类中调用超类的备用构造函数失败,因为from_x
不会修改其输入,__init__
而是返回一个更像__new__
.# failed solution class Child(Parent): def __init__(self): super().from_x(1)
如下所示在子类中调用超类的
from_x
方法也会失败,因为这两种方法都是循环调用的。__new__
# failed solution class Child(Parent): def __new__(self): return super().from_x(1)
在子类中重写超类的
from_x
方法会使子类的重要__init__
方法退化,并使其为 x 分配错误的值。# bad solution class Child(Parent): @classmethod def from_x(cls): return super().from_x(1)
放弃继承并改用组合是可行的,但会增加一个无用的语法层(即
child.parent.x
)。# unfortunate compromise solution class Child: def __init__(self): self.parent = Parent.from_x(3)
我是否错过了实现这个目标的更好选择?