分類: 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.'
'parent'
defbar(
self
,message):
message,
'from parent'
class
foochild(fooparent):
def__init__(
self
):
fooparent.__init__(self
'child'
defbar(
self
,message):
fooparent.bar(self
,message)
'child bar function.'
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.'
'parent'
defbar(
self
,message):
message,
'from parent'
class
foochild(fooparent):
def__init__(
self
):
super(foochild,self
).__init__()
'child'
defbar(
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 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 ...