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 fuction
I'm the parent.
從運行結果上看,普通繼承和super繼承是一樣的。但是其實它們的內部運行機制不一樣,這一點在多重繼承時體現得很明顯。在super機制里可以保證公共父類僅被執行一次,至于執行的順序,是按照mro進行的(E.__mro__)。
注意super繼承只能用于新式類,用于經典類時就會報錯。
新式類:必須有繼承的類,如果沒什么想繼承的,那就繼承object
經典類:沒有父類,如果此時調用super就會出現錯誤:『super() argument 1 must be type, not classobj』
關于super用法的詳細研究可參考「//www.jb51.net/article/66912.htm」
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
