Python3多重继承:可以在一个子构造函数中调用所有的超级构造函数吗?
Python3 multiple inheritance: can call all super constructors at one sub constructor?
我可以在 D's __init__
方法中调用 A, B, C's __init__
吗?下面Dclass只调用了C's __init__
.
class A:
def __init__(self, a='a'):
print("Constructor A")
self.a = a
class B:
def __init__(self, b='b'):
print("Constructor B")
self.b = b
class C:
def __init__(self, c='c'):
print("Constructor C")
self.c = c
class D(C, B, A):
def __init__(self):
super().__init__()
def run(self):
return self.b
d = D()
print(d.run)
如果您了解所有超级classes,您可以显式调用这些方法。
class D(C, B, A):
def __init__(self):
A.__init__(self)
B.__init__(self)
C.__init__(self)
我们甚至可以使用 __mro__
自动执行此操作以获得所有超级classes。
class D(C, B, A):
def __init__(self):
for cls in self.__class__.__mro__[1:]:
cls.__init__(self)
MRO 代表“方法解析顺序”。它是给定 class 的继承层次结构中所有 class 的列表,按照 super()
看到它们的顺序。对于您的 class D
,它是 [D, C, B, A, object]
。我们使用 [1:]
从列表中删除 D
(因为调用 D.__init__
会导致无限递归)。
我可以在 D's __init__
方法中调用 A, B, C's __init__
吗?下面Dclass只调用了C's __init__
.
class A:
def __init__(self, a='a'):
print("Constructor A")
self.a = a
class B:
def __init__(self, b='b'):
print("Constructor B")
self.b = b
class C:
def __init__(self, c='c'):
print("Constructor C")
self.c = c
class D(C, B, A):
def __init__(self):
super().__init__()
def run(self):
return self.b
d = D()
print(d.run)
如果您了解所有超级classes,您可以显式调用这些方法。
class D(C, B, A):
def __init__(self):
A.__init__(self)
B.__init__(self)
C.__init__(self)
我们甚至可以使用 __mro__
自动执行此操作以获得所有超级classes。
class D(C, B, A):
def __init__(self):
for cls in self.__class__.__mro__[1:]:
cls.__init__(self)
MRO 代表“方法解析顺序”。它是给定 class 的继承层次结构中所有 class 的列表,按照 super()
看到它们的顺序。对于您的 class D
,它是 [D, C, B, A, object]
。我们使用 [1:]
从列表中删除 D
(因为调用 D.__init__
会导致无限递归)。