Python中的super()方法

來源:互聯網
上載者:User
這篇文章主要介紹了關於Python中的super()方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到尋找順序(MRO)、重複調用(鑽石繼承)等種種問題。這篇文章主要給大家介紹了關於Python中super()方法的相關資料,需要的朋友可以參考下。

前言

python的類分別有新式類和經典類,都支援多繼承。在類的繼承中,如果你想要重寫父類的方法而不是覆蓋的父類方法,這個時候我們可以使用super()方法來實現

python語言與C++有相似的類繼承,在類定義時,python中會自訂第一個self,類似C++中this指標,指向對象自身。

python簡單的類舉例:

>>> class hello(object): ...     def print_c(): ...       print"hello world!" >>> hello().print_c() hello world!

當然在實際中不可避免的需要類的繼承,子類繼承父類,正常如下:

>>> class child(hello): ...     def print_c(self): ...         hello().print_c() ...          >>> child().print_c() hello world!

在python中還提供了super()機制,例子如下:

>>> class hello(object): ...     def print_c(self): ...       print"hello world!" ...        >>> class child(hello): ...     def print_c(self): ...         super(child,self).print_c() ...          >>> child().print_c() hello world!

注意

Python2.2以前的版本:經典類(classic class)時代

經典類是一種沒有繼承的類,執行個體類型都是type類型,如果經典類被作為父類,子類調用父類的建構函式時會返回這樣的錯誤 '''TypeError: must be type, not classobj'''

這時MRO的方法為DFS(深度優先搜尋(子節點順序:從左至右))。所以本文中使用的是新式類,而新式類的搜尋演算法是C3演算法

class C(object): def minus(self,x):  return x/2class D(C): def minus(self,x):  super(D, self).minus()  print 'hello'

上面的代碼中C是父類,D是子類,我們在D類重新定義了minus方法,就是在C類的功能基礎基礎上新添print 'hello'功能。super在這裡的作用就是在子類中調用父類的方法,這個也是在單繼承常見調用super()的用法。那麼問題來了

class A(object): def __init__(self):  self.n = 10 def minus(self, m):  self.n -= mclass B(A): def __init__(self):  self.n = 7 def minus(self, m):  super(B,self).minus(m)  self.n -= 2b=B()b.minus(2)print b.n

那麼上面的代碼中b.n的輸出是什麼呢?為什麼結果是2呢,而不是5呢?super(B,self).minus(m)明明是調用了父類的minus方法,可是輸出結果就是2,是你要明白現在B的執行個體,而不是A的執行個體,那麼傳遞的self.n的數值是7,而不是10.

那麼對於多繼承的時候,super又是怎樣工作的呢?來,現在建立一個繼承A的C類,然後再建立一個繼承B,C的D類,看看怎樣調用super是重寫方法。

class C(A): def __init__(self):  self.n = 12 def minus(self, m):  super(C,self).minus(m)  self.n -= 5class D(B, C): def __init__(self):  self.n = 15 def minus(self, m):  super(D,self).minus(m)  self.n -= 2d=D()d.minus(2)print d.n

如上的代碼輸出的結果是什麼呢?別心急,先看看它是怎樣啟動並執行。上面提及到新式類尋找子節點時候使用的是C3演算法。那麼它是怎麼找呢。D->B->C->A->object。怎樣才能驗證這個順序是對的呢。

D.__mro__(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)

Mro是什麼呢?對於你定義的每一個類,Python 會計算出一個方法解析順序(Method Resolution Order, MRO)列表,它代表了類繼承的順序。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.