Python の object メソッドの定義は非常に奇妙です。最初のパラメーターは通常 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 サイトの他の関連記事を参照してください。