Python中super的用法

2021-07-03 08:26:33 字數 2226 閱讀 1762

分類: python

2014-05-21 17:50

6637人閱讀收藏 

舉報super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序(mro)、重複呼叫(鑽石繼承)等種種問題。總之前人留下的經驗就是:保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。

普通繼承

『**』

[python]

view plain

copy

class

fooparent(object):  

def__init__(

self

):  

self

.parent = 

'i\'m the parent.'

print

'parent'

defbar(

self

,message):  

print

message, 

'from parent'

class

foochild(fooparent):  

def__init__(

self

):  

fooparent.__init__(self

)  print

'child'

defbar(

self

,message):  

fooparent.bar(self

,message)  

print

'child bar function.'

print

self

.parent  

if__name__==

'__main__'

:  foochild = foochild()  

foochild.bar('helloworld'

)  

super繼承

『**』

[python]

view plain

copy

class

fooparent(object):  

def__init__(

self

):  

self

.parent = 

'i\'m the parent.'

print

'parent'

defbar(

self

,message):  

print

message,

'from parent'

class

foochild(fooparent):  

def__init__(

self

):  

super(foochild,self

).__init__()  

print

'child'

defbar(

self

,message):  

super(foochild, self

).bar(message)  

print

'child bar fuction'

print

self

.parent  

if__name__ == 

'__main__'

:  foochild = foochild()  

foochild.bar('helloworld'

)  

程式執行結果相同,為:

parent

child

helloworld from parent

child bar fuction

i'm the parent.

從執行結果上看,普通繼承和super繼承是一樣的。但是其實它們的內部執行機制不一樣,這一點在多重繼承時體現得很明顯。在super機制裡可以保證公共父類僅被執行一次,至於執行的順序,是按照mro進行的(e.__mro__)。

注意super繼承只能用於新式類,用於經典類時就會報錯。

新式類:必須有繼承的類,如果沒什麼想繼承的,那就繼承object

經典類:沒有父類,如果此時呼叫super就會出現錯誤:『super() argument 1 must be type, not classobj』

關於super用法的詳細研究可參考「

**:

Python中super的用法

super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。普通繼承 python view p...

python中super用法研究

python語言與c 有相似的類繼承,在類定義時,python中會自定義第乙個self,類似c 中this指標,指向物件自身。python簡單的類舉例 class hello object def print c print hello world hello print c hello world...

python類中super 用法

note super only works for new style classes.super 函式的乙個常見用法是在 init 方法中確保父類被正確的初始化了作用super 函式是子類用於呼叫父類 超類 的乙個方法。super 是用來解決多重繼承問題的,直接用類名呼叫父類 base.init ...