Pythonにおけるsuper関数の理解
super()関数は、伝達された2つのパラメータに基づいて、以下のように具体的に作用します.は、第1のパラメータによって伝達されたクラス名によって、現在MRO中のどの位置を決定する.MRO(Method Resolution Order); は、2番目のパラメータによって渡されたselfによって、現在のMROリストを決定する.
次のコードがあります.
以上のコード出力を実行します.Cクラスのsuper()関数を実行すると、実際にAクラスのname関数が呼び出されます.Aにはsuper()関数が注記されているため,後進的には実行されない.そして、現在のMROリストの順番をC,A,B,objectとして印刷する.
Aクラスのコメントを削除すると、コード出力が実行されます.Aが実行されると、Bのname()関数が実行され続けます.Bにsuper関数が残っている場合は、objectにname()関数があるかどうかを検索し続けます.
リファレンスリンク
def super(cls, inst):
mro = inst.__class__.mro() # MRO
return mro[mro.index(cls) + 1] #
次のコードがあります.
class A(object):
def name(self):
print('name is xiaoming')
#super(A,self).name()
class B(object):
def name(self):
print('name is cat')
class C(A,B):
def name(self):
print('name is wang')
super(C,self).name()
if __name__ == '__main__':
c = C()
print(c.__class__.__mro__)
c.name()
以上のコード出力を実行します.Cクラスのsuper()関数を実行すると、実際にAクラスのname関数が呼び出されます.Aにはsuper()関数が注記されているため,後進的には実行されない.そして、現在のMROリストの順番をC,A,B,objectとして印刷する.
(, , , )
name is wang
name is xiaoming
Aクラスのコメントを削除すると、コード出力が実行されます.Aが実行されると、Bのname()関数が実行され続けます.Bにsuper関数が残っている場合は、objectにname()関数があるかどうかを検索し続けます.
(, , , )
name is wang
name is xiaoming
name is cat
リファレンスリンク