python3 super().__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
#(<class '__main__.ChildClassC'>, <class '__main__.ChildClassA'>, <class '__main__.ChildClassB'>, <class '__main__.Base'>, <class 'object'>) 从以上结果,可以看出:
super()和父类没有关系,继承执行的顺序是 ChildClassA → ChildClassB → Base → Object 执行过程:
首先初始化ChlidClassC() ,初始化时先调用ChildClassA的构造方法__Init__(),
进而调用super().__init__()方法,此方法返回当前类的继承顺序中ChildClassA后的一个类ChildClassB,然后在执行ChildClassB的构造方法,
最后执行Base的构造方法,然后依次返回,并执行完成。
在多重继承中 ,ChildClassA()中的 super().__init__() 换成Base.__init__(self),在执行时,继承childA后就会直接跳到Base类里,而略过了ChildClassB:
Enter ChildClassA
Create Base
Leave ChildClassA
(<class '__main__.ChildClassC'>, <class '__main__.ChildClassA'>, <class '__main__.ChildClassB'>, <class '__main__.Base'>, <class 'object'>)
从super()方法可以看出,super()的第一个参数可以是继承链中任意一个类的名字,
如果是本身就会依次继承下一个类;
如果是继承链里之前的类便会无限递归下去;
如果是继承链里之后的类便会忽略继承链汇总本身和传入类之间的类;
比如将ChidClassA()中的super改为:super(ChidClassC, self).__init__(),程序就会无限递归下去。
Enter ChildClassA
Enter ChildClassA
Enter ChildClassA
...
Enter ChildClassA
Enter ChildClassA
Enter ChildClassA
Enter ChildClassA
File "D:/Python20190819/WebApp/venv/Include/testunit.py", line 53, in <module>
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 ChildClassB
Enter ChildClassA
Create 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 ChildClassB
Enter ChildClassA
Create Base
Leave ChildClassA
Leave ChildClassB
参考自:开源中国 http://my.oschina.net/jhao104/blog/682322
python3 super().__init__() 和 __init__() 的区别的更多相关文章
- python中的__init__和__new__的区别
一.__init__ 方法是什么?(init前后的线是双下划线) 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例 ...
- Python中__init__和__new__的区别详解
__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- cod ...
- python中的super( test, self).__init__()
python中的super( test, self).__init__() 对继承自父类的属性进行初始化 首先找到test的父类(比如是类A),然后把类test的对象self转换为类A的对象,然后“被 ...
- python3.6 子类的__init__调用父类的__init__
python3.6 子类的__init__调用父类的__init__ 父类 class worker: def __init__(self): self.a=1 self.b=2 if __name_ ...
- super(Student,self).__init__()初始化的是什么东西?
继承不是为了继承里面原来的属性和值么,不初始化的话,会有什么问题? 2015-04-04源自:python进阶 5-17642 浏览2 回答 最佳回答 2015-05-05 1 super(Stude ...
- __init__ 和__new__的区别
__init__和__new__的区别 __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值. __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例, ...
- Python super(Todo,self).__init__() TypeError: super() argument 1 must be type, not classobj
示例如下 class A(): def __init__(self):pass class B(A): def __init__(self): super(A, self).__init__() 当调 ...
- python3 super().__init__()
父类不会自动调用__init__方法 class A: def __init__(self): A = 'A' self.a = 'a' print('init A') class B(A): def ...
- __init__和__new__的区别
根据官方文档: __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值. __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法. 也 ...
随机推荐
- less-important
!important关键字:会为所有混合带来的样式,添加!important 在css里面加上!important,是所有样式优先级最高的 在less里面什么场景会用important,在调试的时候 ...
- 剑指Offer的学习笔记(C#篇)-- 左旋转字符串
题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...
- UPS电源运用在数据中心,有什么优势?
UPS电源是每个数据中心为了保证服务器与计算设备不被电力线干扰与电能质量问题所影响的设备. 1.电源选择 运用在线式或是后备式UPS电源,均需依照微机设备的需求与经济条件所决定.若是经济条件相对较好, ...
- 基于 Go 的可嵌入脚本语言 zygomys
zygomys zygomys 是一种可嵌入的脚本语言. 它是一个具有面向对象风格的现代化 Lisp,提供了一个解释器和 REPL(Read-Eval-Print-Loop:也就是说,它带有一个命令行 ...
- C语言学习系列(六)存储类
一.C存储类 存储类定义C程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在他们所修饰的类型之前.for example:auto.register.static.extern. (一).a ...
- 015_STM32程序移植之_NRF24L01模块
STM32程序移植之NRF24L01模块 引脚接线图如下所示 STM32引脚 NRF24L01引脚 功能 GND GND 3.3V 3.3V PB8 CE PB9 CSN PB13 SCK PB15 ...
- P1594 护卫队
题目描述 护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是一条单行道,所以任何车辆都不能超车.桥能承受一个给定的最大承载量.为了控制桥上的交通,桥两边各站一个指挥员.护卫车队被分 ...
- GAN生成式对抗网络(一)——原理
生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型 GAN包括两个核心模块. 1.生成器模块 --generator 2.判别器模块--de ...
- Mysql备份恢复方案解析
1.全量备份和增量备份 1.1全量备份 就是对现有的数据进行全部备份,之前做的备份均可舍弃,以最新的全备为基点. a.全备所有数据库 Innodb引擎: [root@leader mysql]#mys ...
- POJ 2778 DNA Sequence —— (AC自动机+矩阵快速幂)
距离上次做AC自动机有很久了=.=,以前这题的思路死活看不懂,现在还是觉得很好理解的. 思路参见:http://blog.csdn.net/morgan_xww/article/details/783 ...