super 是用來解決多重繼承問題的,直接用類名調(diào)用父類方法在使用單繼承的時(shí)候沒問題,但是如果使用多繼承,會(huì)涉及到查找順序(MRO)、重復(fù)調(diào)用(鉆石繼承)等種種問題。總之前人留下的經(jīng)驗(yàn)就是:保持一致性。要不全部用類名調(diào)用父類,要不就全部用 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')?
程序運(yùn)行結(jié)果相同,為:
Parent
Child
HelloWorld from Parent
Child bar fuction
I'm the parent.
從運(yùn)行結(jié)果上看,普通繼承和super繼承是一樣的。但是其實(shí)它們的內(nèi)部運(yùn)行機(jī)制不一樣,這一點(diǎn)在多重繼承時(shí)體現(xiàn)得很明顯。在super機(jī)制里可以保證公共父類僅被執(zhí)行一次,至于執(zhí)行的順序,是按照mro進(jìn)行的(E.__mro__)。
注意super繼承只能用于新式類,用于經(jīng)典類時(shí)就會(huì)報(bào)錯(cuò)。
新式類:必須有繼承的類,如果沒什么想繼承的,那就繼承object
經(jīng)典類:沒有父類,如果此時(shí)調(diào)用super就會(huì)出現(xiàn)錯(cuò)誤:『super() argument 1 must be type, not classobj』
關(guān)于super用法的詳細(xì)研究可參考「//www.jb51.net/article/66912.htm」
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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