python深坑集錦 super

2022-07-24 02:33:08 字數 3794 閱讀 5714

一、前言

python 物件導向中有繼承這個概念,初學時感覺很牛逼,裡面也有個super類,經常見到,最近做一些題才算是理解了。特地記錄分享給後來研究的小夥伴,畢竟現在小學生都開始學了(滑稽臉)

二、**

直接上乾貨,能把下面乙個問題全答對,後面就不用看了。

class a():

def go(self):

print ("go a go!")

def stop(self):

print ("stop a stop!")

def pause(self):

raise exception("not implemented")

class b(a):

def go(self):

super(b, self).go()

print ("go b go!")

class c(a):

def go(self):

super(c, self).go()

print ("go c go!")

def stop(self):

super(c, self).stop()

print ("stop c stop!")

class d(b,c):

def go(self):

super(d, self).go()

print ("go d go!")

def stop(self):

super(d, self).stop()

print ("stop d stop!")

def pause(self):

print ("wait d wait!")

class e(b,c):

pass

a = a()

b = b()

c = c()

d = d()

e = e()

# 說明下列**的輸出結果

a.go()

print('--------')

b.go()

print('--------')

c.go()

print('--------')

d.go()

print('--------')

e.go()

print('--------')

a.stop()

print('--------')

b.stop()

print('--------')

c.stop()

print('--------')

d.stop()

print('--------')

e.stop()

print(d.mro())

a.pause()

b.pause()

c.pause()

d.pause()

e.pause()

當然,直接執行就有答案了,還是要仔細想一下,反正看到我第一次跑出的結果的時候,我都不敢相信自己的眼睛。

step1:

幾個概念:

繼承的功能:父類的**重用

多型的功能:同一方法對不同型別的物件會有相應的結果

開閉原則:對擴充套件開放,對修改封閉

super類功能:新式類實現廣度優先的不重複的呼叫父類,解決了鑽石繼承(多繼承)的難題

step2:

super實現原理:通過c3演算法,生成mro(method resolution order)列表,根據列表中元素順序查詢呼叫

新式類呼叫順序為廣度優先,舊式類為深度優先

step3:

個人理解:

1.呼叫了父類的方法,出入的是子類的例項物件

2.新式類子類(a,b),a就在b之前

3.super類似於巢狀的一種設計,當**執行到super例項化後,先去找同級父類,若沒有其餘父類,再執行自身父類,再往下走,

簡潔點的三個原則就是:

子類在父類前,所有類不重複呼叫,從左到右

理解了以上的說法,題目就沒問題了。

也不用跑了,答案如下:

a.go()# go a go!

b.go()# go a go!# go b go!

c.go()# go a go!# go c go!

d.go()# go a go!# go c go!# go b go!# go d go!

e.go()# go a go!# go c go!# go b go!

a.stop()# stop a stop!

b.stop()# stop a stop!

c.stop()# stop a stop!# stop c stop!

d.stop()# stop a stop!# stop c stop!# stop d stop!

e.stop()# stop a stop!

a.pause()# ... exception: not implemented

b.pause()# ... exception: not implemented

c.pause()# ... exception: not implemented

d.pause()# wait d wait!

e.pause()# ...exception: not implemented

看了答案,其實還有一點,父類拋異常的情況,如果子類有不拋異常的方法,異常就不丟擲了,這個設計也會很有用。

這裡就中間乙個a,c,b,d的和網上常見的不太一樣,促使我仔細研究了一下,其實就是個人理解第三條。

補充:python2 和python3在這個問題上的差別

python2 沒有預設繼承object

python3 預設全部繼承object類,都是新式類

python2super呼叫 super(開始類名,self).函式名()

python3  super().函式名()

關於呼叫父類函式傳入子類例項的栗子舉乙個:

class a:

def __init__(self):

self.n = 2

def add(self, m):

print('self is @a.add'.format(self))

self.n += m

class b(a):

def __init__(self):

self.n = 3

def add(self, m):

print('self is @b.add'.format(self))

super().add(m)

print('newb')

self.n += 3

class c(a):

def __init__(self):

self.n = 4

def add(self, m):

print('self is @c.add'.format(self))

super().add(m)

print('newc')

self.n += 4

class d(b, c):

def __init__(self):

self.n = 5

def add(self, m):

print('self is @d.add'.format(self))

super().add(m)

self.n += 5

d = d()

d.add(2)

print(d.n)

夜深了,暫時會這麼多就寫這麼多,有空研究c3原理(挖個坑先)

python基本操作 super

一 單繼承 只繼承乙個父類,父類沒有繼承其他父類 classa object def init self print i am class a class c a def init self super c,self init print yes super c,self init 這句話的解釋是 ...

python報錯集錦

解決 把os.mkdir 修改為 os.makedirs即可 1.mkdir path mode 作用 建立乙個目錄,可以是相對或者絕對路徑,mode的預設模式是0777。2.makedirs path mode 作用 建立遞迴的目錄樹,可以是相對或者絕對路徑,mode的預設模式也是0777。ope...

python知識集錦

程式執行方式 互動式 也稱為解釋語言或指令碼語言 和檔案式 也稱為編譯語言或靜態語言 解釋語言 逐條轉換為目標 編譯語言 整體轉換為目標 程式語言 對計算機能夠理解和識別使用者操作的一種互動體系,按照特定規則組織計算機指令,使計算機自動進行運算處理。電腦程式 按照程式語言規則組織起來的一組計算機指令...