ホームページ  >  記事  >  バックエンド開発  >  Pythonのsuper()関数の使い方と動作原理の詳細な説明

Pythonのsuper()関数の使い方と動作原理の詳細な説明

巴扎黑
巴扎黑オリジナル
2017-08-21 14:57:426149ブラウズ

Python のオブジェクト メソッドの定義は非常に奇妙です。通常、最初のパラメータは self (他の言語でのこれに相当) という名前が付けられ、システムを呼び出すときにオブジェクト自体を渡すために使用されます。自動的に通過します。

今日紹介する主役は super() で、Super() はクラスの継承でよく使用され、親クラスのメソッドを複数回呼び出す場合に実行されるのは 1 回だけです。実行を最適化します。以下で詳しく見てみましょう。

例を挙げます:

class Foo:
  def bar(self, message):
    print(message)
>>> Foo().bar("Hello, Python.")
Hello, Python.

継承関係がある場合、サブクラスで親クラスのメソッドを呼び出す必要がある場合があります。このとき、最も簡単な方法は、オブジェクト呼び出しをクラス呼び出しに変換することです。現時点では、self パラメータを明示的に渡す必要があることに注意してください。例:

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    FooParent.bar(self, message)
>>> FooChild().bar("Hello, Python.")
Hello, Python.

これには、いくつかの欠点があります。たとえば、親クラスの名前が変更されると、複数の変更がサブクラスに反映されます。また、Pythonは前述したように多重継承が可能な言語です。多重継承がある場合には上記のメソッドを何度も記述する必要があり、面倒に思えます。これらの問題を解決するために、Python は super() メカニズムを導入しました。コード例は次のとおりです。

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    super(FooChild, self).bar(message)
>>> FooChild().bar("Hello, Python.")
Hello, Python.

表面的には、 super(FooChild, self).bar(message) メソッドと FooParent.bar の結果です。 (self, message) メソッドは一貫していますが、実際、これら 2 つのメソッドの内部処理メカニズムは大きく異なります。多重継承が関係する場合は、明らかな違いがあります。

コード 1:

class A:
  def __init__(self):
    print("Enter A")
    print("Leave A")
class B(A):
  def __init__(self):
    print("Enter B")
    A.__init__(self)
    print("Leave B")
class C(A):
  def __init__(self):
    print("Enter C")
    A.__init__(self)
    print("Leave C")
class D(A):
  def __init__(self):
    print("Enter D")
    A.__init__(self)
    print("Leave D")
class E(B, C, D):
  def __init__(self):
    print("Enter E")
    B.__init__(self)
    C.__init__(self)
    D.__init__(self)
    print("Leave E")
E()

結果:

Eを入力

Bを入力

Aを入力

Aを離れる

Bを離れる

Cを入力

Aを入力

Aを離れる

Cを離れる

Dを入力

Aを離れる

Aを離れる

Leave E

実行順序は理解しやすいですが、唯一注意が必要なのは、公開親クラス A が複数回実行されることです。

コード 2:

class A:
  def __init__(self):
    print("Enter A")
    print("Leave A")
class B(A):
  def __init__(self):
    print("Enter B")
    super(B, self).__init__()
    print("Leave B")
class C(A):
  def __init__(self):
    print("Enter C")
    super(C, self).__init__()
    print("Leave C")
class D(A):
  def __init__(self):
    print("Enter D")
    super(D, self).__init__()
    print("Leave D")
class E(B, C, D):
  def __init__(self):
    print("Enter E")
    super(E, self).__init__()
    print("Leave E")
E()

結果:

E を入力

B を入力

C を入力

D を入力

A を入力

A のまま

D のまま

C のまま

B のまま

Eを離れる

スーパー機構では、パブリック親クラスの実行順序はMRO(Method Resolution Order):メソッド解決順序に従うことが保証されています。このMROの仕組みについては後ほど詳しく紹介します。

以上がPythonのsuper()関数の使い方と動作原理の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。