亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中supper如何使用

發布時間:2021-07-12 10:47:43 來源:億速云 閱讀:198 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關Python中supper如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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 {0} @A.add'.format(self))
    self.n += m
class B(A):
  def __init__(self):
    self.n = 3
  def add(self, m):
    print('self is {0} @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 {0} @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 {0} @D.add'.format(self))
    super().add(m)
    self.n += 5
d = D()
d.add(2)
print(d.n)

看完上述內容,你們對Python中supper如何使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庄浪县| 通海县| 威远县| 武清区| 呼伦贝尔市| 八宿县| 诸暨市| 民和| 承德市| 南木林县| 齐齐哈尔市| 大埔区| 青浦区| 扶绥县| 宜川县| 琼中| 清水河县| 荣成市| 齐河县| 定南县| 隆回县| 南靖县| 兰西县| 葫芦岛市| 乌兰浩特市| 贺州市| 社旗县| 扬中市| 昌图县| 府谷县| 清涧县| 仁寿县| 青州市| 潼南县| 西丰县| 台湾省| 安陆市| 前郭尔| 长垣县| 道真| 东乌珠穆沁旗|