super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序(mro)、重複呼叫(鑽石繼承)等種種問題。總之前人留下的經驗就是:保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。
普通繼承
**如下:class
fooparent(object):
def__init__
(self):
self.parent = '
i\'m the parent.
'parent
'def
bar(self,message):
print message, '
from parent
'class
foochild(fooparent):
def__init__
(self):
fooparent.
__init__
(self)
'child
'def
bar(self,message):
fooparent.bar(self,message)
'child bar function.
self.parent
if__name__=='
__main__
':
foochild =foochild()
foochild.bar(
'helloworld
')
super繼承
**如下:class
fooparent(object):
def__init__
(self):
self.parent = '
i\'m the parent.
'parent
'def
bar(self,message):
print message,'
from parent
'class
foochild(fooparent):
def__init__
(self):
super(foochild,self).
__init__
()
'child
'def
bar(self,message):
super(foochild, self).bar(message)
'child bar fuction
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...