super()在呼叫祖父母類的方法時,我似乎無法完全理解其真正的作業原理。例如,假設我們有以下代碼
class A():
def __init__(self):
print("initializing A")
def method(self):
print("method A")
class B(A):
def __init__(self):
print("initializing B")
def method(self):
print("method B")
class C(B):
def __init__(self):
print("initializing C")
def method(self):
super(B, self).method()
c = C()
c.method()
這將輸出
initializing C
method A
我不明白為什么語法(意思super(Parent, self).method())是這樣的,更重要的是幕后發生了什么。Python 官方檔案(這里)說
class super([type[, object-or-type]]) - 回傳一個代理物件,它將方法呼叫委托給型別的父類或同級類。這對于訪問已在類中重寫的繼承方法很有用。 object-or-type 確定要搜索的方法決議順序。搜索從型別之后的類開始。
為什么type傳遞的super([type[, object-or-type]])必須是父類B而不是祖父類A?以及傳遞self(在這種情況下是 class 的實體C)如何幫助確定要搜索的方法決議順序?
uj5u.com熱心網友回復:
的解析度順序C為[C, B, A, object]。當您使用 時super,您正在尋找提供請求方法的下一個類。內部C.method,super()和等價的:在 .之后的類中super(C, self)查找第一個定義。當您作為第一個引數傳遞時,您要求的是在下面的類中的第一個定義。method CBmethodB
(如果不是self,第二個引數將用于選擇完全不同的 MRO,而不僅僅是在適當的 MRO 中搜索的不同起始位置。)
其他引數的用例super非常罕見,值得在語言本身中添加特殊邏輯以允許super()在適當的位置使用顯式引數。(它們不僅僅是默認函式引數,因為“默認”值取決于super呼叫的背景關系。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/432214.html
