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(メソッド解決順序)メソッド解決順序に従って実行されます。 。