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 サイトの他の関連記事を参照してください。