pythonsuper 函式的詳解

2022-09-24 10:48:10 字數 2061 閱讀 4778

目錄

python是一門物件導向的語言,定義類時經常要用到繼承,在類的繼承中,子類繼承父類中已經封裝好的方法,不需要再次編寫,如果子類如果重新定義了父類的某一方法,那麼該方法就會覆蓋父類的同名方法,但是有時我們希望子類保持父類方法的基礎上進行擴充套件,而不是直接覆蓋,就需要先呼叫父類的方法,然後再進行功能的擴充套件,這時就可以通過super來實現對父類方法的呼叫。

看下面乙個例子:

class a:

def func(self):

print("a的func執行")

class b(a):

def func(self)

super().func()

print("b擴充套件的func執行")

b = b()

b.func()

# 輸出結果為:

# a的func執行

www.cppcns.com# b擴充套件的fu程式設計客棧nc執行

上面程式中,a是父類,b是a的子類,我們在a類中重定義了func()方法,在b類中重新定義了func()方法,在方法中通過super().func()又呼叫了父類的方法,所以執行結果才會有a類func()方法輸出。

如果經常看python內建庫及第三方庫原始碼的話,你會發現,super用的非常多的地方是在子類中呼叫父類的初始化__init__()方法,這種用法非常常見。

class a:

def __init__(self, x):

self.x = x

class b(a):

def __init__(self, x, y):

super().__init__(x)

self.y = y

b = b(1, 2)

print(b.x, b.y)

看到這,你會想到super就是用來獲取父類並用來呼叫父類方法的,這樣說對不對呢,其實是不對的,使用supper獲取的不是父類,而是mro列表中的下乙個類,所謂mro列表即方法解析順序(method resolution order)列表,它代表著類繼承的順序,我們可以使用以下幾種獲得某個類的mro列表:

c.mro()

c.__mro__

c.__class__.__mro__

mro列表的順序確定經歷了很多次的變遷,最新的是通過c3線性化演算法來實現的,感興趣的話可以自行了解一下,總的來說,乙個類的mro列表就是合併所有usxwc父類的mro列表,並遵循以下三條原則:

下面來看一下下面這個例子:

class a(base):

def func(self):

print("a的func執行")

super().func()

print("a的func執行完畢")

class b(base):

def func(self):

print("b的func執行")

super().func()

print("b的func執行完畢")

class c(a, b):

def func(self):

print("c的func執行")

super().func()

print("c的func執行完畢")

c = c()

c.func()

# 獲取mro列表

print(c.__class__.__mro__)

執行結果如下:

上述程式中,base是父類,a、b都繼承自base,c繼承自 a、b,它們的繼承關係就是乙個典型的菱形繼承,如下:

通過結果我們可以看出,super並不是獲取父類並用來呼叫父類的方法,而是根據mro列表一次呼叫下乙個類,使用c.__class__.__mro__可以獲取mro列表,mro列表的順序是c、a、b、base、object。

super計算方法解析順序中的下乙個類,可以接收兩個引數:

def super(cls, inst):

mro = inst.__class__.mro()

return mro[mro.index(cls) + 1]

本文標題: pythonsuper()函式的詳解

本文位址: /jiaoben/python/440703.html

Python super 函式簡介

python 內建函式 描述 super 函式是用於呼叫父類 超類 的乙個方法。super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。mro 就是類的方法解析順序表,其實也就是繼承父類方法時...

Python super 函式用法總結

了解 super 函式之前,我們首先要知道 super 的用途是啥?語法格式 super type object or type 函式描述 返回乙個 物件,它會將方法呼叫委託給 type 的父類或兄弟類。引數說明 type 類,可選引數。object or type 物件或類,一般是 self,可選...

python super函式使用方法詳解

python內建函式super 主要用於類的多繼承中,用來查詢並呼叫父類的方法,所以在單重繼承中用不用 super 都沒關係 但是,使用 super 是乙個好的習慣。一般我們在子類中需要呼叫父類的方法時才會這麼用 super type,object or type 引數 type 類,一般是類名 o...