ミニマリスト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)メソッドの結果は同じです。実際、2つのメソッドの内部処理メカニズムは大きく異なります。多重継承が含まれる場合、明らかな違いになります。例:

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

結果は次のとおりです。
ここに画像の説明を挿入
結論:スーパーメカニズムでは、パブリック親クラスが1回だけ実行されることが保証されます。実行順序については、MRO(メソッド解決順序)メソッド解決順序に従って実行されます。 。

おすすめ

転載: blog.csdn.net/qq_28057379/article/details/115279562