Python super() 函數解析


 最近發現在python語言中很多模型的繼承類喜歡使用super()函數來調用父類,我也看了一些其它博客的解釋,發現有些含混,令讀者無法很快理解。因此,本博客進對super()函數進行易懂哦那個的解釋如下:

一. super()函數的定義及解釋。

super() 函數是用於調用父類(超類)的一個方法。

super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復調用(鑽石繼承)等種種問題。

MRO 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。

 

  是否發現解釋有點頭暈,其實它就是一個聲明,我可以在子類中調用父類,解決繼承類中使用父類的函數!

二.父類調用(不用super()函數)

首先給一個簡單的類繼承調用函數,這個很簡單,我不用解釋接下來我會給一個錯誤的調用。

class A(object):
def __init__(self):
self.nameaa = 'aa'
def funca(self):
print('function funca' )
class B(A):
def __init__(self):
self.namebb = 'bb'
def funcb(self):
print('function funcb ' )

b = B() # 建立對象
print(b.funcb()) #調用子類的函數
print(b.funca()) # 調用父類的函數

結果如下:

 

 

然后是一個錯誤的調用(即添加函數A.funca())如下,卻出現了報錯的問題,接下來引出這樣的一個問題,我想在繼承類中調用父類的函數,該如何解決了,我繼續給一段正確調用的代碼:

class A(object):
def __init__(self):
self.nameaa = 'aa'
def funca(self):
print('function funca' )
class B(A):
def __init__(self):
self.namebb = 'bb'
def funcb(self):
A.funca()
print('function funcb ' )

b = B() # 建立對象
print(b.funcb()) #調用子類的函數
print(b.funca()) # 調用父類的函數

結果如下:

 

 

接着普通方法正確在繼承類中調用父類函數的使用:

class A(object):
def __init__(self):
self.nameaa = 'aa'
def funca(self):
print('function funca' )
class B(A):
def __init__(self):
self.namebb = 'bb'
def funcb(self):
t=A()
t.funca()
print('function funcb ' )

b = B() # 建立對象
print(b.funcb()) #調用子類的函數
print(b.funca()) # 調用父類的函數

結果如下:

 

 

然而,你會發現上面在繼承類中使用父類函數等是比較麻煩的,需要對父類創建對象,然后在調用,為此出現了super()函數簡單解決這個問題,

代碼如下:

class A(object):
def __init__(self):
self.nameaa = 'aa'
def funca(self):
print('function funca' )
class B(A):
def __init__(self):
self.namebb = 'bb'
def funcb(self):
super().funca()
print('function funcb ' )

b = B() # 建立對象
print(b.funcb()) #調用子類的函數
print(b.funca()) # 調用父類的函數

結果如下:

 

 

這樣就輕松的解決了此問題! 

 

轉載請注明鏈接:https://www.cnblogs.com/tangjunjun/p/12349962.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM