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__() 的区别的更多相关文章

  1. python中的__init__和__new__的区别

    一.__init__ 方法是什么?(init前后的线是双下划线) 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例 ...

  2. Python中__init__和__new__的区别详解

    __init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- cod ...

  3. python中的super( test, self).__init__()

    python中的super( test, self).__init__() 对继承自父类的属性进行初始化 首先找到test的父类(比如是类A),然后把类test的对象self转换为类A的对象,然后“被 ...

  4. python3.6 子类的__init__调用父类的__init__

    python3.6 子类的__init__调用父类的__init__ 父类 class worker: def __init__(self): self.a=1 self.b=2 if __name_ ...

  5. super(Student,self).__init__()初始化的是什么东西?

    继承不是为了继承里面原来的属性和值么,不初始化的话,会有什么问题? 2015-04-04源自:python进阶 5-17642 浏览2 回答 最佳回答 2015-05-05 1 super(Stude ...

  6. __init__ 和__new__的区别

    __init__和__new__的区别 __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值. __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例, ...

  7. 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__() 当调 ...

  8. python3 super().__init__()

    父类不会自动调用__init__方法 class A: def __init__(self): A = 'A' self.a = 'a' print('init A') class B(A): def ...

  9. __init__和__new__的区别

    根据官方文档:   __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值. __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法.  也 ...

随机推荐

  1. [Abp vNext微服务实践] - 文章目录

    简介 ABP vNext是volosoft的新一代框架,ABP(vNext)完全使用.NET CORE和DDD(领域驱动)打造,目前GitHub已有6K+次提交,发布版本超过40次,Nuget包下载量 ...

  2. php中unserialize 返回false的解决方法

    serialize 序列化 unserialize 反序列化 $content = 'a:5:{s:4:"img1";s:5:"35568";s:4:" ...

  3. 2019EC-Final参赛总结

    本来想发知乎上的,后来发现太长就放这好了23333 没写过这种东西,所以写得比较混乱&流水账 以下内容均为我的个人视角XD   赛前 在车上的时候,红太阳跟我们说他头晕(虽然他好像每场比赛都头 ...

  4. vue 配置CDN加速

    1.首先index.html 中配置cdn 引入 <!-- 引入样式 --> <link rel="stylesheet" href="//cdn.bo ...

  5. //点击按钮加减音频音量到最小会出现bug什么意思???

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. paramiko远程上传下载文件

    import paramiko import sys user = "root" pwd = " # 上传文件 def sftp_upload_file(server_p ...

  7. 字节(byte)、二进制、字节流、字符流相关概念分析

    https://blog.csdn.net/changwilling/article/details/52065955 1.字节: 字(Byte)节是长度单位.位(bit)也是长度单位. 因为计算机通 ...

  8. 026_编写 nginx 启动脚本

    #!/bin/bash#本脚本编写完成后,放置在/etc/init.d/目录下,就可以被 Linux 系统自动识别到该脚本#如果本脚本名为/etc/init.d/nginx,则 #service ng ...

  9. Dynamic Data linq to SQL Web Application

    微软提供了一个数据驱动网站模板,可以自动生成CRUD页面,使用过程中碰到些问题 1.首先是如何应用,只需要创建个context并且在Global.asax里面加入下面这一句就可以了 DefaultMo ...

  10. ueditor+word粘贴上传!

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...