日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 关于super 的 用法和原理(挖坑)

發布時間:2025/3/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 关于super 的 用法和原理(挖坑) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

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實例化后,先去找同級父類,若沒有其余父類,再執行自身父類,再往下走,

簡潔點的三個原則就是:

子類在父類前,所有類不重復調用,從左到右

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

也不用跑了,答案如下:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' 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 = 2def add(self, m):print('self is {0} @A.add'.format(self))self.n += mclass B(A):def __init__(self):self.n = 3def add(self, m):print('self is {0} @B.add'.format(self))super().add(m)print('newb')self.n += 3class C(A):def __init__(self):self.n = 4def add(self, m):print('self is {0} @C.add'.format(self))super().add(m)print('newc')self.n += 4class D(B, C):def __init__(self):self.n = 5def add(self, m):print('self is {0} @D.add'.format(self))super().add(m)self.n += 5d = D() d.add(2) print(d.n)

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

總結

以上是生活随笔為你收集整理的Python 关于super 的 用法和原理(挖坑)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。