この記事の内容はPythonでスーパー関数の継承を実装する方法についてですが、ある程度参考になる内容ですので、困っている方は参考にしていただければ幸いです。
Py 2.x と Py 3.x の大きな違いは、クラス定義であれクラス継承であれ、クラスです。 Py 3.x のクラス継承では、元の super(Class, self) の代わりに super() キーワードを直接使用できます。
では、super() は何に基づいているのでしょうか?今日はそれを分析してみましょう。
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 wangname is xiaoming
として出力されます。クラス A のコメントを削除すると、実行コードが出力されます。 A が実行されると、実行が継続されることがわかります。 B の name() 関数。 B にスーパー関数がまだある場合は、オブジェクトに name() 関数があるかどうかを検索し続けます。
rreeee以上がPython のスーパー関数はどのように継承を実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。