首頁  >  文章  >  後端開發  >  Python中的super()方法

Python中的super()方法

不言
不言原創
2018-06-01 16:36:221579瀏覽

這篇文章主要介紹了關於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/2

class 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 -= m


class B(A):
 def __init__(self):
  self.n = 7

 def minus(self, m):
  super(B,self).minus(m)
  self.n -= 2
b=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 -= 5


class D(B, C):
 def __init__(self):
  self.n = 15

 def minus(self, m):
  super(D,self).minus(m)
  self.n -= 2

d=D()
d.minus(2)
print d.n

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

D.__mro__
(<class &#39;__main__.D&#39;>, <class &#39;__main__.B&#39;>, <class &#39;__main__.C&#39;>, <class &#39;__main__.A&#39;>, <type &#39;object&#39;>)

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

相關推薦:

詳解python中super()函數的用法及工作原理

以上是Python中的super()方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn