3 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
考慮如何實(shí)例化:C
c = C(a=3, b=5, c=9)
C.__init__
獲取所有關(guān)鍵字參數(shù),但僅將關(guān)鍵字參數(shù)用于其自己的參數(shù)。其余的將傳遞給鏈中的下一個(gè)方法。在本例中,即 ,它“拉出”的參數(shù)并傳遞給 。 使用它并將(現(xiàn)在為空的)關(guān)鍵字參數(shù)集傳遞給下一個(gè)方法 。由于所有關(guān)鍵字參數(shù)都已“聲明”并由其他類處理,因此會(huì)成功。c
__init__
A.__init__
a
b
B.__init__
B
object.__init__
object.__init__
由于 MRO 的構(gòu)造方式,正確使用的類保證在調(diào)用時(shí)集體為空。super()
**kwargs
object.__init__

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
由于方法解析順序?yàn)?,可以按以下方式定義嗎?(__main__.C, __main__.A, __main__.B, object)class B
否,因?yàn)檫@樣會(huì)失敗:
class D:
def __init__(self, d, **kwargs):
self.d = d
super().__init__(**kwargs)
class E(C, D):
def __init__(self, e, **kwargs):
self.e = e
super().__init__(**kwargs)
的 MRO 是 ,所以必須調(diào)用,否則不會(huì)被調(diào)用。E(E, C, A, B, D, object)Bsuper().__init__D.__init__
難道不是多余的,因?yàn)槿魏斡鄠鬟f到都會(huì)傳遞到,提高?super().__init__(**kwargs)class BkwargsCobject
不,因?yàn)樵谏厦娴睦又?,盈余將流向。但即使沒有這個(gè),當(dāng)你調(diào)用一個(gè)參數(shù)太多構(gòu)造函數(shù)時(shí),引發(fā)錯(cuò)誤也不是多余的;最好有一條錯(cuò)誤消息通知您不正確的代碼,而不是讓錯(cuò)誤未被發(fā)現(xiàn)。kwargsD.__init__
這是否是如果被定義為而不是?Cclass C(B, A)class C(A, B)
從某種意義上說,當(dāng)然;但實(shí)際上,它是在任何類層次結(jié)構(gòu)中發(fā)生的保護(hù)措施,只要層次結(jié)構(gòu)中的其他類遵循相同的調(diào)用規(guī)則。Bsuper().__init__(**kwargs)

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊
在這個(gè)例子中,如果它像你說的那樣定義(第1點(diǎn))并且是原樣的(并且沒有其他用途),那么它的工作原理是一樣的。BC
至于第2點(diǎn):如果還剩下關(guān)鍵字參數(shù),那么對(duì)構(gòu)造函數(shù)的調(diào)用確實(shí)會(huì)失敗,例如:super()
c = C(a=1, b=2, c=3, d=4)
# -> TypeError: object.__init__() takes exactly one argument (the instance to initialize)
由于該類(最初)是編寫的,因此如果像您所說的那樣以相反的順序使用,或者如果有一個(gè)(或)多個(gè)超類(es),也是可以的,例如:B
class D:
def __init__(self, d, **kwargs):
super().__init__(**kwargs)
self.d = d
class C(A,B,D):
...
添加回答
舉報(bào)