super() 関数の具体的な機能は、渡された 2 つのパラメータに基づいて次のようになります:
最初のパラメータとして渡されたクラス名は、MRO 内の現在の位置を決定します。 MRO (メソッド解決順序);
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 関数が実際に呼び出されます。 super() 関数は A でコメントアウトされているため、実行は後方に続行されません。そして、現在の MRO リストの順序は C,A,B,object として出力されます。
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)name is wang name is xiaoming
クラス A のコメントを削除した後、実行コードの出力は次のようになります。 A が実行されると、B の名前が継続して表示されることがわかります。 ()関数が実行されます。 B にスーパー関数がまだある場合は、オブジェクトに name() 関数があるかどうかを検索し続けます。
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)name is wang name is xiaoming name is cat
Python のスーパー関数の理解に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。