Chapter12-类继承第12章-类继承超函数问题超函数Py2.x与Py2.x的一大区别py3.x就是类,无论是类的定义还是类的继承。Py3.x中类的继承可以直接使用super()关键字代替原来的super(Class,self)。那么super()到底继承自什么呢?根据传入的两个参数,super()函数的具体作用如下:通过第一个参数传入的类名决定了当前在MRO中的位置。MRO(MethodResolutionOrder)通过作为第二个参数传入的self来确定当前的MRO列表。classA(object):defname(self):print('nameisxiaoming')#super(A,self).name()classB(object):defname(self):print('nameiscat')classC(A,B):defname(self):print('nameiswang')super(C,self).name()if__name__=='__main__':c=C()print(c.__class__.__mro__)c.name()返回结果是:(,,,)nameiswangnameisxiaoming如果把注解去掉的结果是:(,,,)nameiswangnameisxiaomingnameiscat再看一个例子:classBase(object):deffunc_1(self):print('thisisbase')classA(Base):deffunc_1(self):super().func_1()print('这是A')B类(基础):deffunc_1(self):super().func_1()print('这是B')C类(A,B):deffunc_1(self):super()。func_1()print('这是c')print(C.mro())C().func_1()print(help(C))返回结果:HelponclassCinmodule__main__:classC(A,B)|方法解析顺序:|丙|一个|B的意思是“从左到右”,C的继承关系最近的是A,然后是B,最后是上层BASE调用方法时的入栈顺序为CABBase,出栈顺序为BaseBAC,classBase(object):def__init__(self):print("Basecreated")classChildA(Base):def__init__(self):Base.__init__(self)classChildB(Base):def__init__(self):#super(ChildB,self).__init__()#或者更简单的写法#super().__init__()#如果你不这样做使用super,你需要这样做Writeprint("self=",self)#<__main__.ChildBobjectat0x000001EA8CD085F8>mro=type(self).mro()print(mro)#[,,]fornext_classinmro[mro.index(ChildB)+1:]:print(next_class)#ifhasattr(next_class,'__init__'):next_class.__init__(self)breakprint(ChildA())print("#"*10)print(ChildB())问题看下面代码:classBase(object):def__init__(self):print("Basecreated")classChildA(Base):def__init__(self):print("ChildAinit...")Base.__init__(self)classChildB(Base):def__init__(self):print("ChildBinit..")#super(ChildB,self).__init__()#或更简单的写法super().__init__()if__name__=="__main__":print(ChildA())print("#"*10)print(ChildB())returnvalue:ChildAinit...Basecreated<__main__.ChildAobjectat0x000001D089FE85F8>##########ChildBinit..Basecreated<__main__.ChildBobjectat0x000001D089FE85F8>可以看到结果是一样的,然后Base.__init__(self)和super().__init__()有什么区别?看看这个例子:classBase(object):def__init__(self):print("Basecreated")classUserDependency(Base):def__init__(self):print("UserDependencyinit...")).__init__()classChildA(Base):def__init__(self):print("ChildAinit...")Base.__init__(self)classChildB(Base):def__init__(self):print("ChildBinit..")#super(ChildB,self).__init__()#或者更简单的写法r().__init__()类UserA(ChildA,UserDependency):def__init__(self):print("UserAinit...")super(UserA,self).__init__()classUserB(ChildB,UserDependency):def__init__(self):打印("UserBinit...")super(UserB,self).__init__()if__name__=="__main__":print(UserA())print("#"*10)print(UserB())返回结果:UserAinit...ChildAinit...Basecreated<__main__.UserAobjectat0x0000019295A38B00>##########UserBinit...ChildBinit..UserDependencyinit...Basecreated<__main__.UserBobjectat0x0000019295A38B00>这里我们看到区别了,在多重继承中,没有使用super方法的类,也没有调用UserDependency方法