国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python super()函數的詳解

python super()函數的詳解

2022-03-07 12:38程序員-夏天 Python

這篇文章主要為大家介紹了python super()函數,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

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

 

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執行
# B擴展的func執行

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

如果經??碢ython內置庫及第三方庫源碼的話,你會發現,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列表就是合并所有父類的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__)

執行結果如下:

python super()函數的詳解

上述程序中,Base是父類,A、B都繼承自Base,C繼承自 A、B,它們的繼承關系就是一個典型的菱形繼承,如下:

python super()函數的詳解

通過結果我們可以看出,super并不是獲取父類并用來調用父類的方法,而是根據MRO列表一次調用下一個類,使用c.__class__.__mro__可以獲取MRO列表,MRO列表的順序是C、A、B、Base、object。

 

super的原理

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

def super(cls, inst):
  mro = inst.__class__.mro()
  return mro[mro.index(cls) + 1]

 

總結

現在我們知道:supper獲取的是MRO列表中的下一個類,當前類的父類沒有實質性的關系;還有如何查看MRO列表。最后需要注意的是super以及MRO列表,針對都是Python新式類!

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/weixin_50097774/article/details/121521738

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 色综合天天天天做夜夜夜夜做 | 久久毛片 | 国内精品视频在线观看 | 久久久久香蕉视频 | 日本黄色大片免费看 | 久久久成人av| 综合久久av | 久久天天操 | 亚洲精品乱码久久久久久金桔影视 | 黄色免费毛片 | 快色视频在线观看 | 91在线免费网站 | 亚洲精品一区二区网址 | 精品亚洲永久免费精品 | 欧美日韩精品一区 | 91av蝌蚪| 久操视频免费在线观看 | 中国黄色视屏 | 欧洲一区二区三区 | 国产免费一区二区三区 | 九九九久久久 | 亚洲国产欧美日韩 | 最好看的2019年中文在线观看 | 欧美国产在线观看 | 久久福利电影 | 日韩国产欧美一区 | 欧美成人高清视频 | 欧美一级二级三级 | 日本中文字幕在线免费观看 | 久久久www成人免费精品 | 国产性猛交xxxx免费看久久 | 国变精品美女久久久久av爽 | 在线二区| 国产精品一区二区三区在线 | 最近免费中文字幕在线视频2 | 91黄色片 | 久久99国产精品久久99大师 | 亚洲第一福利视频 | 超碰人人操 | 99精品一区二区 | 国产美女久久久 |