Python中super的用法例項

2022-03-17 23:02:27 字數 2078 閱讀 8992

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

普通繼承

**如下:

class

fooparent(object):

def__init__

(self):

self.parent = '

i\'m the parent.

'print

'parent

'def

bar(self,message):

print message, '

from parent

'class

foochild(fooparent):

def__init__

(self):

fooparent.

__init__

(self)

print

'child

'def

bar(self,message):

fooparent.bar(self,message)

print

'child bar function.

'print

self.parent

if__name__=='

__main__

':

foochild =foochild()

foochild.bar(

'helloworld

')

super繼承

**如下:

class

fooparent(object):

def__init__

(self):

self.parent = '

i\'m the parent.

'print

'parent

'def

bar(self,message):

print message,'

from parent

'class

foochild(fooparent):

def__init__

(self):

super(foochild,self).

__init__

()

print

'child

'def

bar(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 fuctioni'

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 2014 05 21 17 50 6637人閱讀收藏 舉報super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類...

python中super用法研究

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