Python のスーパー関数を理解する

高洛峰
リリース: 2017-02-18 10:48:10
オリジナル
1229 人が閲覧しました

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 wang
name is xiaoming
ログイン後にコピー

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

(<class &#39;__main__.C&#39;>, <class &#39;__main__.A&#39;>, <class &#39;__main__.B&#39;>, <class &#39;object&#39;>)name is wang
name is xiaoming
name is cat
ログイン後にコピー


Python のスーパー関数の理解に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート