区分单继承和多重继承
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)属性。
【继承中super的调用顺序】
继承中super的调用顺序是与MRO-C3的类方法查找顺序一样的(https://hanjianwei.com/2013/07/25/python-mro/)菱形继承,从左到右的深度遍历,留重复元素的最后一个,
Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
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__()
ref
https://blog.csdn.net/paopaohll/article/details/83063349