天天看點

python多繼承super_python3 – super()對多繼承的行為

不幸的是,如果不知道D的方法解析順序(MRO),就無法在D中調用super()來擷取兩個基類.

但是MRO是強大的概念.在第二種情況下,

class D(C,A):

...

(MRO)是

>>> D.mro()

[, , , , ]

因為調用super()會帶你到MRO中的下一個類,就像Pieters先生所說的那樣,并且你希望列印語句按照A,B,C的順序排列,然後是D,隻需要輸入super().foo( )首先在foo()的每個定義中列印(…)秒.唯一的例外是不要在類A中放置super().foo(),因為foo()沒有在object中定義.

#! /usr/bin/env python3

class A(object):

def __init__(self):

super().__init__()

def foo(self):

print("The")

class B(object):

def __init__(self):

super().__init__()

def foo(self):

super().foo() # Inserted

print("world")

class C(B):

def __init__(self):

super().__init__()

def foo(self):

super().foo()

print("is")

class D(C,A): # Correct ordering

def __init__(self):

super().__init__()

def foo(self):

super().foo()

print("nice")

d = D()

d.foo()

替代解決方案

第一種情況下D(A,C)的MRO也包括所有類,是以正确排序super()和print(…)語句,可以使它工作:

class A(object):

def foo(self):

print("The")

super().foo()

class B(object):

def foo(self):

print("world")

class C(B):

def foo(self):

super().foo()

print("is")

class D(A,C):

def foo(self):

super().foo()

print("nice")

D().foo()

進一步閱讀

要了解繼承順序(例如D類(C,A)或D類(A,C))和MRO,請參閱https://www.python.org/download/releases/2.3/mro/.較長的描述了C3方法的分辨率順序,并且有很好的繪制的ASCII類層次結構,标記了MRO.