【发布时间】:2022-01-17 01:58:09
【问题描述】:
我看到super().__init__(*args) 曾经安全地调用超级构造函数(以一种不会失败菱形继承的方式)。但是我找不到以这种方式调用具有不同参数的不同超级构造函数的方法。
这是一个说明问题的示例。
from typing import TypeVar, Generic
X = TypeVar("X")
Y = TypeVar("Y")
class Base:
def __init__(self):
pass
class Left(Base, Generic[X]):
def __init__(self, x:X):
super().__init__()
self.lft = x
class TopRight(Base, Generic[Y]):
def __init__(self, y:Y):
super().__init__()
self.rgh = y
class BottomRight(TopRight[Y], Generic[Y]):
def __init__(self, y:Y):
super().__init__(y + y)
class Root(Left[X], BottomRight[Y], Generic[X, Y]):
def __init__(self, x:X, y:Y):
pass #issue here
#does not work
#super().__init__(x)
#super().__init__(y)
#calls base twice
#Left[X].__init__(x)
#BottomRight[Y].__init__(y)
如何分别安全地呼叫Left.__init__(x) 和BottomRight.__init__(y)?
【问题讨论】:
-
一方面,
super().__init__()调用Left和TopRight是不行的,因为它们甚至不尊重Base的签名。您可以传入int或将默认参数添加到Base以解决该问题。 -
我认为简短的回答是不要做这样的事情。像 Java 这样的东西不支持菱形继承是有原因的。
-
感谢您指出示例代码的问题,此外,多重继承仍然有用,特别是考虑到 python 的打字系统。
-
现在
Base有语法错误(你忘了pass)
标签: python inheritance init superclass diamond-problem