您好,欢迎来到年旅网。
搜索
您的当前位置:首页python3super().__init__()和__init__()的区别

python3super().__init__()和__init__()的区别

来源:年旅网
python3super().__init__()和__init__()的区别

1、单继承

super().__int__()和 Base.__init__(self)是⼀样的, super()避免了基类的显式调⽤。

class Base(object): def __init__(self): print('Create Base')class ChildClassA(Base): def __init__(self):

print('Create ChildClassA') super().__init__()ChildClassA()#输出

#Create ChildClassA#Create Base

2、多继承

注意:多继承时,会设计继承顺序,supper()相当于返回继承顺序的下⼀个类,⽽不是⽗类。

def GetSupperOrder(class_name,self): mro = self.__class__.mro()

# #mro()⽤来获得类的继承顺序。

return mro[mro.index(class_name) + 1]class Base(object): def __init__(self): print('Create Base')class ChildClassA(Base): def __init__(self):

print('Enter ChildClassA') super().__init__()

print('Leave ChildClassA')class ChildClassB(Base): def __init__(self):

print('Enter ChildClassB') super().__init__()

print('Leave ChildClassB')

class ChildClassC(ChildClassA,ChildClassB): pass

c = ChildClassC()

print(c.__class__.__mro__)# 输出:

#Enter ChildClassA#Enter ChildClassB#Create Base

#Leave ChildClassB#Leave ChildClassA

#(, , , , )从以上结果,可以看出:

super()和⽗类没有关系,继承执⾏的顺序是 ChildClassA → ChildClassB → Base → Object

执⾏过程:

⾸先初始化ChlidClassC() ,初始化时先调⽤ChildClassA的构造⽅法__Init__(),

进⽽调⽤super().__init__()⽅法,此⽅法返回当前类的继承顺序中ChildClassA后的⼀个类ChildClassB,然后在执⾏ChildClassB的构造⽅法,最后执⾏Base的构造⽅法,然后依次返回,并执⾏完成。

在多重继承中 ,ChildClassA()中的 super().__init__() 换成Base.__init__(self),在执⾏时,继承childA后就会直接跳到Base类⾥,⽽略过了ChildClassB:

Enter ChildClassACreate Base

Leave ChildClassA

(, , , , )

从super()⽅法可以看出,super()的第⼀个参数可以是继承链中任意⼀个类的名字,  如果是本⾝就会依次继承下⼀个类;  如果是继承链⾥之前的类便会⽆限递归下去;

  如果是继承链⾥之后的类便会忽略继承链汇总本⾝和传⼊类之间的类;

  ⽐如将ChidClassA()中的super改为:super(ChidClassC, self).__init__(),程序就会⽆限递归下去。

Enter ChildClassAEnter ChildClassAEnter ChildClassA...

Enter ChildClassAEnter ChildClassAEnter ChildClassAEnter ChildClassA

File \"D:/Python20190819/WebApp/venv/Include/testunit.py\", line 53, in c = ChildClassC()

File \"D:/Python20190819/WebApp/venv/Include/testunit.py\", line 41, in __init__ super(ChildClassC, self).__init__()

File \"D:/Python20190819/WebApp/venv/Include/testunit.py\", line 41, in __init__ super(ChildClassC, self).__init__()

File \"D:/Python20190819/WebApp/venv/Include/testunit.py\", line 41, in __init__ super(ChildClassC, self).__init__() [Previous line repeated 992 more times]

File \"D:/Python20190819/WebApp/venv/Include/testunit.py\", line 40, in __init__ print('Enter ChildClassA')

RecursionError: maximum recursion depth exceeded while calling a Python object

3、super()避免重复调⽤

如果ChildClassA继承Base, ChildClassB继承ChildClassA和Base,如果ChildClassB需要调⽤Base的__init__()⽅法时,就会导致__init__()被执⾏两次:

\"\"\"

单继承 super().__int__()和 Base.__init__(self)是⼀样的, super()避免了基类的显式调⽤。class Base(object): def __init__(self): print('Create Base')class ChildClassA(Base): def __init__(self):

print('Create ChildClassA') super().__init__()

class ChildClassB(Base): def __init__(self):

print('Create ChildClassB') super().__init__()

ChildClassA()#输出

#Create ChildClassA#Create Base\"\"\"

\"\"\"

多继承:

注意:多继承时,会设计继承顺序,supper()相当于返回继承顺序的下⼀个类,⽽不是⽗类。\"\"\"

class Base(object): def __init__(self): print('Create Base')class ChildClassA(Base): def __init__(self):

print('Enter ChildClassA') Base.__init__(self)

print('Leave ChildClassA')class ChildClassB(ChildClassA,Base): def __init__(self):

print('Enter ChildClassB') ChildClassA.__init__(self) Base.__init__(self)

print('Leave ChildClassB')b = ChildClassB()# 输出:

Enter ChildClassBEnter ChildClassACreate Base

Leave ChildClassA

Create Base

Leave ChildClassB

supper() 避免重复

\"\"\"

单继承 super().__int__()和 Base.__init__(self)是⼀样的, super()避免了基类的显式调⽤。class Base(object): def __init__(self): print('Create Base')class ChildClassA(Base): def __init__(self):

print('Create ChildClassA') super().__init__()

class ChildClassB(Base): def __init__(self):

print('Create ChildClassB') super().__init__()

ChildClassA()#输出

#Create ChildClassA#Create Base\"\"\"

\"\"\"

多继承:

注意:多继承时,会设计继承顺序,supper()相当于返回继承顺序的下⼀个类,⽽不是⽗类。\"\"\"

class Base(object): def __init__(self): print('Create Base')class ChildClassA(Base): def __init__(self):

print('Enter ChildClassA') super( ).__init__()

print('Leave ChildClassA')class ChildClassB(ChildClassA,Base): def __init__(self):

print('Enter ChildClassB') super().__init__()

print('Leave ChildClassB')b = ChildClassB()# 输出:

Enter ChildClassBEnter ChildClassACreate Base

Leave ChildClassALeave ChildClassB

参考⾃:开源中国

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务