Pythonにおけるsuper関数の理解

1225 ワード

super()関数は、伝達された2つのパラメータに基づいて、以下のように具体的に作用します.
  • は、第1のパラメータによって伝達されたクラス名によって、現在MRO中のどの位置を決定する.MRO(Method Resolution Order);
  • は、2番目のパラメータによって渡されたselfによって、現在のMROリストを決定する.
  • 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

    リファレンスリンク