Python的super函式直觀理解

2022-06-29 05:24:11 字數 3666 閱讀 5346

super相關的介紹文章看了無數遍,每次看得都雲裡霧裡的,沒過多久就忘了,只模糊知道跟mro有關,但是稍微一複雜就不知道怎麼回事了,本篇文章主要記錄我對super的理解,盡量以簡單易懂的方式介紹,如果你看完這篇文章還是沒懂。。。那麼很抱歉,我盡力了hhhh

super的作用就是執父類的方法,雖然這句話不完全對,但是也差不多是那麼個意思了。

比如以單繼承為例

class a:

def p(self):

print('a')

class b(a):

def p(self):

super().p()

b().p()

>>> a

可以看到b().p()其實就是執行的a.p前面介紹的是最簡單的情況,那萬一複雜一點,比如多繼承的情況呢?這種情況我們只要知道 mro 序列,無論super怎麼變化都不怕了,記住公式就完事了。mro 序列簡單理解就是記錄了各個類繼承的先後順序,看下面的例子就明白了

mro 的介紹可以看這篇文章:

我們看下面的例子

class a:

def p(self):

print('a')

class b():

def p(self):

print('b')

class c(a,b):

def p(self):

print('c')

class d(c):

def p(self):

print('d')

a = a()

b = b()

c = c()

d = d()

四個類的mro (可以通過檢視__mro__屬性獲得,例如a.__mro__)) 分別是:

什麼意思呢,我們以a類為例,它的mro順序是他自己和object,很好理解,因為python裡一切都是物件,所以你可以看到四個類的終點都是object。那c類的 mro 也好理解,第乙個順序永遠是寄幾,然後按照**順序依次是a,b,最後是object

相信看到這你應該知道mro是什麼意思了吧,那super是怎麼用的呢?

super本身其實就是乙個類,super()其實就是這個類的例項化物件,它需要接收兩個引數super(class, obj),它返回的是obj的mro中class類的父類(可能有點繞,待會看後面的栗子就好懂了):

看到這裡如果還是沒明白,咱們就多看幾個例子就完事了,建議你可以開啟ipython輸入如下示例,可以更加直觀感受super

首先我們看看下面的命令是什麼意思呢?

super(c, d).p()
前面我們說過super的作用是返回的是obj的mro中class類的父類,在這裡就表示返回的是d的mro中c類的父類

返回的是d的mro:(d, c, a, b, object)

c類的父類:a

那麼super(c, d)就等價於a,那麼super(c, d).p()會輸出a

下面**結果是什麼呢?

super(a, c).p()
返回的是c的mro中a類的父類

返回的是c的mro:(c, a, b, object)

c類的父類:b

所以最後的輸出是b

注意:有的類裡面沒有super()

class a:

def p(self):

print('a')

class b(a):

def p(self):

super().p()

print('b')

class c(b):

def p(self):

print('c')

class d(c):

def p(self):

print('d')

d = d()

d.p()

這個很簡單,最後只會輸出d那如果d類改成如下樣子呢?

class d(c):

def p(self):

super().p()

print('d')

很簡單,我們首先寫出d的mro為 (d,c,b,a,object),預設狀態下,super()就表示前乙個父類,這裡就是c類,那麼super().p()就會呼叫cp函式,但是c.p裡沒有呼叫super,所以就與a,b類無關了,那麼最終的輸出就是c,d我們再看看最複雜的繼承情況

class a:

def p(self):

print('a')

class b(a):

def p(self):

super().p()

print('b')

class c(b):

def p(self):

super().p()

print('c')

class d(c):

def p(self):

super().p()

print('d')

d = d()

d.p()

這裡建議你自己在紙上畫一下

所以最終結果是a b c d

對於無論有多少個super(class, obj),我們首先需要知道obj的mro是什麼,然後找到class的前乙個class是什麼就好了。

marsggbo♥原創

2021-03-12 21:40:18

python中的super 函式

最能感受到super函式的作用在於進行鑽石繼承的時候。鑽石繼承 由乙個基類衍生兩個及以上的超類,然後在衍生,在類樹的最底層生成乙個子類,這樣的類樹結構就是乙個類似 鑽石外形,所以,最底層類繼承稱為鑽石繼承 首先 這是直接通過超類呼叫方法給子類使用 class baseclass num base c...

python中super函式的用法

super的正確傳參有兩種 super 類名,物件名 和super 類名1,類名2 來自wowcpp博主 引數必須要滿足的條件 super cls,obj 即傳入類名 物件名 obj物件必須是cls類的物件 cls子類的物件當然也是cls類的物件 記作 type obj cls 2.super cl...

python之類中的super函式

作用 實現 重用 思考 super真的只是呼叫父類麼?super函式是按照mro演算法去呼叫的,不bb上 class a def init self print a class b a def init self print b super init class c a def init self ...