【转】python类中super()和__init__()的区别
【轉(zhuǎn)】python類中super()和__init__()的區(qū)別
單繼承時(shí)super()和__init__()實(shí)現(xiàn)的功能是類似的
class Base(object):def __init__(self):print 'Base create'class childA(Base):def __init__(self):print 'creat A ',Base.__init__(self)class childB(Base):def __init__(self):print 'creat B ',super(childB, self).__init__()base = Base()a = childA() b = childB()輸出結(jié)果:
Base create creat A Base create creat B Base create區(qū)別是使用super()繼承時(shí)不用顯式引用基類。
super()只能用于新式類中
把基類改為舊式類,即不繼承任何基類
class Base():def __init__(self):print 'Base create'執(zhí)行時(shí),在初始化b時(shí)就會(huì)報(bào)錯(cuò):
super(childB, self).__init__() TypeError: must be type, not classobjsuper不是父類,而是繼承順序的下一個(gè)類
在多重繼承時(shí)會(huì)涉及繼承順序,super()相當(dāng)于返回繼承順序的下一個(gè)類,而不是父類,類似于這樣的功能:
def super(class_name, self):mro = self.__class__.mro()return mro[mro.index(class_name) + 1]mro()用來(lái)獲得類的繼承順序。
例如:
輸出結(jié)果如下:
enter A enter B Base create leave B leave A (<class '__main__.childC'>, <class '__main__.childA'>, <class '__main__.childB'>, <class '__main__.Base'>, <type 'object'>)supder和父類沒(méi)有關(guān)聯(lián),因此執(zhí)行順序是A —> B—>—>Base
執(zhí)行過(guò)程相當(dāng)于:初始化childC()時(shí),先會(huì)去調(diào)用childA的構(gòu)造方法中的 super(childA, self).__init__(), super(childA, self)返回當(dāng)前類的繼承順序中childA后的一個(gè)類childB;然后再執(zhí)行childB().__init()__,這樣順序執(zhí)行下去。
在多重繼承里,如果把childA()中的 super(childA, self).__init__() 換成Base.__init__(self),在執(zhí)行時(shí),繼承childA后就會(huì)直接跳到Base類里,而略過(guò)了childB:
enter A Base create leave A (<class '__main__.childC'>, <class '__main__.childA'>, <class '__main__.childB'>, <class '__main__.Base'>, <type 'object'>)從super()方法可以看出,super()的第一個(gè)參數(shù)可以是繼承鏈中任意一個(gè)類的名字,
如果是本身就會(huì)依次繼承下一個(gè)類;
如果是繼承鏈里之前的類便會(huì)無(wú)限遞歸下去;
如果是繼承鏈里之后的類便會(huì)忽略繼承鏈匯總本身和傳入類之間的類;
比如將childA()中的super改為:super(childC, self).__init__(),程序就會(huì)無(wú)限遞歸下去。
如:
super()可以避免重復(fù)調(diào)用
如果childA基礎(chǔ)Base, childB繼承childA和Base,如果childB需要調(diào)用Base的__init__()方法時(shí),就會(huì)導(dǎo)致__init__()被執(zhí)行兩次:
class Base(object):def __init__(self):print 'Base create'class childA(Base):def __init__(self):print 'enter A 'Base.__init__(self)print 'leave A'class childB(childA, Base):def __init__(self):childA.__init__(self)Base.__init__(self)b = childB()Base的__init__()方法被執(zhí)行了兩次
enter A Base create leave A Base create使用super()是可避免重復(fù)調(diào)用
class Base(object):def __init__(self):print 'Base create'class childA(Base):def __init__(self):print 'enter A 'super(childA, self).__init__()print 'leave A'class childB(childA, Base):def __init__(self):super(childB, self).__init__()b = childB() print b.__class__.mro() enter A Base create leave A [<class '__main__.childB'>, <class '__main__.childA'>, <class '__main__.Base'>, <type 'object'>]轉(zhuǎn)載于:https://www.cnblogs.com/langqi250/p/10032077.html
總結(jié)
以上是生活随笔為你收集整理的【转】python类中super()和__init__()的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2018/11/26
- 下一篇: python 多线程入门试验