极简Python教程-----super()函数的理解

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)方法解析顺序进行的。

猜你喜欢

转载自blog.csdn.net/qq_28057379/article/details/115279562