Python中super的用法
生活随笔
收集整理的這篇文章主要介紹了
Python中super的用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
uper 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復調用(鉆石繼承)等種種問題。總之前人留下的經驗就是:保持一致性。要不全部用類名調用父類,要不就全部用 super,不要一半一半。
普通繼承
『代碼』
[python]?view plain?copy 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')??
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』
普通繼承
『代碼』
[python]?view plain?copy
super繼承
『代碼』
[python]?view plain?copy
程序運行結果相同,為:
ParentChild
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』
總結
以上是生活随笔為你收集整理的Python中super的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2-3:配置与环境之定制提示符
- 下一篇: 2016.6.23 随笔———— AJA