python語言與c++有相似的類繼承,在類定義時,python中會自定義第乙個self,類似c++中this指標,指向物件自身。
python簡單的類舉例:
>>> class hello(object):
... def print_c():
... print"hello world!"
>>> hello().print_c()
hello world!
當然在實際中不可避免的需要類的繼承,子類繼承父類,正常如下:
>>> class child(hello):
... def print_c(self):
... hello().print_c()
...
>>> child().print_c()
hello world!
在python中還提供了super()機制,例子如下:
>>> class hello(object):
... def print_c(self):
... print"hello world!"
...
>>> class child(hello):
... def print_c(self):
... super(child,self).print_c()
...
>>> child().print_c()
hello world!
第一眼看過來是不是感覺一樣?
在python中引入super()的目的是保證相同的基類只初始化一次(注意:
1super ()機制是用來解決多重繼承的,對於直接呼叫父類名是沒有問題的,但在之後根據前人的經驗就是:要麼都用類名呼叫,要麼就全部用super(),不要混合的用,由此為人做事還是要專一的嘛o(∩_∩)o~
2 super()繼承只能用於新式類,用於經典類時就會報錯。
新式類:必須有繼承的類,如果無繼承的,則繼承object
經典類:沒有父類,如果此時呼叫super就會出現錯誤:『super() argument 1 must be type, not classobj)
好,再舉乙個例子
class parent1(object):
def __init__(self):
print 'is parent1'
print 'goes parent1'
class parent2(object):
def __init__(self):
print 'is parent2'
print 'goes parent2'
class child1(parent1):
def __init__(self):
print'is child1'
parent.__init__(self)
print 'goes child1'
class child2 (parent1) :
def __init__(self):
print 'is child2'
parent.__init__(self)
print 'goes child2'
class child3(parent2):
def __init__(self):
print 'is child3'
parent2.__init__(self)
print 'goes child3'
class grandson(child3,child2,child1):
def __init__(self):
print 'is grandson'
child1.__init__(self)
child2.__init__(self)
child3.__init__(self)
print'goes grandson'
if __name__=='__main__':
grandson()
is grandson
is child1
is parent1
goes parent1
goes child1
is child2
is parent1
goes parent1
goes child2
is child3
is parent2
goes parent2
goes child3
goes grandson
好了,在這兒發現什麼問題了沒有?對,基類parent1被多次執行,而有時我們只希望公共的類只被執行一次,那麼此時我們引入super()機制檢視效果:
class parent1(object):
def __init__(self):
super(parent1, self).__init__()
print 'is parent1'
print 'goes parent1'
class parent2(object):
def __init__(self):
super(parent2, self).__init__()
print 'is parent2'
print 'goes parent2'
class child1(parent1):
def __init__(self):
print'is child1'
#parent1.__init__(self)
super(child1, self).__init__()
print 'goes child1'
class child2 (parent1) :
def __init__(self):
print 'is child2'
#parent1.__init__(self)
super(child2, self).__init__()
print 'goes child2'
class child3(parent2):
def __init__(self):
print 'is child3'
#parent2.__init__(self)
super(child3, self).__init__()
print 'goes child3'
class grandson(child3,child2,child1):
def __init__(self):
print 'is grandson'
#child1.__init__(self)
#child2.__init__(self)
#child3.__init__(self)
super(grandson, self).__init__()
print'goes grandson'
if __name__=='__main__':
grandson()
此時我們檢視結果:
is grandson
is child3
is child2
is child1
is parent1
goes parent1
goes child1
goes child2
is parent2
goes parent2
goes child3
goes grandson
結果很明顯,公共基類parent1只被執行一次。
grandson類的繼承體系如下圖所示:
object
|/ \
p1 p2
/ \ |
c1 c2 c3
所以對於類的繼承體系,我們可以看做乙個圖,而每乙個類看做乙個節點,那麼super()機制的執行順序是按照圖的廣度優先搜尋演算法查詢super()的父類。
後續總結:
1. super()是乙個類名而非函式,super(class, self)事實上呼叫了super類的初始化函式,
產生了乙個super物件;
2 super()機制必須要用新式類,否則會報錯;
3 super()或直接父類呼叫最好只選擇一種形式。
Python中super的用法
super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。普通繼承 python view p...
Python中super的用法
分類 python 2014 05 21 17 50 6637人閱讀收藏 舉報super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類...
python類中super 用法
note super only works for new style classes.super 函式的乙個常見用法是在 init 方法中確保父類被正確的初始化了作用super 函式是子類用於呼叫父類 超類 的乙個方法。super 是用來解決多重繼承問題的,直接用類名呼叫父類 base.init ...