當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python super用法及代碼示例


用法:

class super([type[, object-or-type]])

返回一個代理對象,該對象將方法調用委托給 type 的父類或兄弟類。這對於訪問已在類中重寫的繼承方法很有用。

object-or-type 確定要搜索的方法解析順序。搜索從 type 之後的類開始。

例如,如果 object-or-type__mro__D -> B -> C -> A -> object 並且 type 的值是 B ,則 super() 搜索 C -> A -> object

object-or-type__mro__ 屬性列出了 getattr()super() 使用的方法解析搜索順序。該屬性是動態的,並且可以在更新繼承層次結構時更改。

如果省略第二個參數,則返回的超級對象是未綁定的。如果第二個參數是一個對象,isinstance(obj, type) 必須為真。如果第二個參數是類型,issubclass(type2, type) 必須為真(這對類方法很有用)。

super 有兩個典型用例。在具有單繼承的類層次結構中,super 可用於引用父類而不顯式命名它們,從而使代碼更易於維護。這種用法與在其他編程語言中使用super 非常相似。

第二個用例是在動態執行環境中支持協作多重繼承。這個用例是 Python 獨有的,在靜態編譯的語言或僅支持單繼承的語言中找不到。這使得實現“diamond diagrams” 成為可能,其中多個基類實現相同的方法。好的設計要求這樣的實現在每種情況下都具有相同的調用簽名(因為調用的順序是在運行時確定的,因為該順序會適應類層次結構的變化,並且因為該順序可以包括在運行前未知的兄弟類)。

對於這兩個用例,典型的超類調用如下所示:

class C(B):
    def method(self, arg):
        super().method(arg)    # This does the same thing as:
                               # super(C, self).method(arg)

除了方法查找,super() 也適用於屬性查找。一種可能的用例是調用父類或兄弟類中的說明符。

請注意,super() 是作為顯式點屬性查找的綁定過程的一部分實現的,例如 super().__getitem__(name) 。它通過實現自己的__getattribute__() 方法來以支持協作多重繼承的可預測順序搜索類來實現這一點。因此,super() 對於使用語句或運算符(例如 super()[name] )的隱式查找未定義。

另請注意,除了零參數形式之外,super() 不限於使用內部方法。兩個參數形式精確地指定參數並進行適當的引用。零參數形式僅適用於類定義,因為編譯器填寫必要的詳細信息以正確檢索正在定義的類,以及訪問普通方法的當前實例。

有關如何使用 super() 設計協作類的實用建議,請參閱 guide to using super()

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 super。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。