ホームページ  >  記事  >  バックエンド開発  >  Python のスーパー関数はどのように継承を実装しますか?

Python のスーパー関数はどのように継承を実装しますか?

不言
不言転載
2019-03-06 15:21:472058ブラウズ

この記事の内容は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 &#39;__main__.C&#39;>, <class &#39;__main__.A&#39;>, <class &#39;__main__.B&#39;>, <class &#39;object&#39;>)name is wangname is xiaoming

として出力されます。クラス A のコメントを削除すると、実行コードが出力されます。 A が実行されると、実行が継続されることがわかります。 B の name() 関数。 B にスーパー関数がまだある場合は、オブジェクトに name() 関数があるかどうかを検索し続けます。

rreeee

以上がPython のスーパー関数はどのように継承を実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はPythonで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。