Python中类的初始化都是__init__()函数, 在涉及到父类和子类的继承问题时,如果子类初始化的同时也继承父类的__init__(), 就需要在子类中显式地通过super()来调用父类的__init__()函数。
super()在单继承中的应用:
class Animal: # 定义一个父类
def __init__(self): # 父类的初始化
self.name = 'animal'
self.role = 'parent'
print('I am father')
class Dog(Animal): # 定一个继承Animal的子类
def __init__(self): # 子类的初始化函数,此时会覆盖父类Animal类的初始化函数
print('I am son')
super(Dog, self).__init__() # 在子类进行初始化时,也想继承父类的__init__()就通过super()实现
self.name = 'dog' #覆盖
animal = Animal()
xbai = Dog()
print(xbai.name)
print(xbai.role)
结果如下:
说明:super(Dog,self)也可以写成super(),可以理解成super(Dog,self).init() == Animal.init(self),
虽然表面上看 super(Dog,self).init()方法和 Animal.init(self)方法的结果是一致的,实际上这两种方法的内部处理机制大大不同,当涉及多继承情况时,就会表现出明显的差异来,直接给例子:
1、不使用super()函数:
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
A.__init__(self)
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
A.__init__(self)
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
A.__init__(self)
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
B.__init__(self)
C.__init__(self)
D.__init__(self)
print("Leave E")
E()
结果如下:
2、使用super()函数,示例如下:
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
super(B, self).__init__()
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
super(C, self).__init__()
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
super(D, self).__init__()
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
super(E, self).__init__()
print("Leave E")
E()
结果如下:
结论:在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照MRO(Method Resolution Order)方法解析顺序进行的。