Python类中super()和__init__()的关系

区分单继承和多重继承

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200511568dd94e77b21d4b8597ede8bf65c36bcd000

1.单继承时super()和__init__()实现的功能是类似的

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()

#输出:

Base create
creat A  Base create
creat B  Base create

使用super()继承时不用显式引用基类。

python中的super( test, self).init()

首先找到test的父类(比如是类A),然后把类test的对象self转换为类A的对象,然后“被转换”的类A对象调用自己的__init__函数

【super作用】
1如果子类(Puple)继承父类(Person)不做初始化,那么会自动继承父类(Person)属性name。
2如果子类(Puple_Init)继承父类(Person)做了初始化,且不调用super初始化父类构造函数,那么子类(Puple_Init)不会自动继承父类的属性(name)。
3如果子类(Puple_super)继承父类(Person)做了初始化,且调用了super初始化了父类的构造函数,那么子类(Puple_Super)也会继承父类的(name)属性。
Python类中super()和__init__()的关系_第1张图片

【继承中super的调用顺序】

继承中super的调用顺序是与MRO-C3的类方法查找顺序一样的(https://hanjianwei.com/2013/07/25/python-mro/)菱形继承,从左到右的深度遍历,留重复元素的最后一个,

Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
Python类中super()和__init__()的关系_第2张图片

class A:
    def __init__(self):
        print('A')
        
class B(A):
    def __init__(self):
        print('B')
        super().__init__()

class C(A):
    def __init__(self):
        print('C')
        super().__init__()

class D(A):
    def __init__(self):
        print('D')
        super().__init__()
        
class E(B, C):
    def __init__(self):
        print('E')
        super().__init__()


class F(C, D):
    def __init__(self):
        print('F')
        super().__init__()

class G(E, F):
    def __init__(self):
        print('G')
        super().__init__()

Python类中super()和__init__()的关系_第3张图片
ref
https://blog.csdn.net/paopaohll/article/details/83063349

你可能感兴趣的:(python)