Pythonのsuper()の機能と原理を詳しく解説

高洛峰
リリース: 2016-10-17 16:16:29
オリジナル
1208 人が閲覧しました

Python のオブジェクト メソッドの定義は非常に奇妙です。最初のパラメータは通常 self という名前であり、これはオブジェクト自体を渡すために使用され、システムを呼び出すときに明示的に渡す必要はありません。自動的に通過します。

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


例を挙げます:

class Foo:
  def bar(self, message):
    print(message)
ログイン後にコピー

>>> Foo().bar("Hello, Python.")
Hello, Python.
ログイン後にコピー

継承関係がある場合、サブクラスで親クラスのメソッドを呼び出す必要がある場合があります。この場合、最も簡単な方法は次のとおりです。オブジェクト呼び出しを変換します。クラスに呼び出す場合、この時点で self パラメータを明示的に渡す必要があることに注意してください。たとえば、次のようになります。これは、たとえば、親クラス名が変更されると、子クラスで多くの変更が行われることになります。また、Python は多重継承が可能な言語であるため、上記のメソッドを複数回記述する必要があります。多重継承があるので面倒です。これらの問題を解決するために、Python は super() メカニズムを導入しました。コード例は次のとおりです。 bar(self, message) メソッドの結果は一貫しています。実際、2 つのメソッドの内部処理メカニズムは大きく異なります。例を直接挙げてみましょう。 :

コード 1:

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    FooParent.bar(self, message)
ログイン後にコピー


結果:


E を入力

B を入力

A を入力

A から離れる


B から離れる

C を入力

Enter A

Leave A

Leave C

Enter D

Enter A


Leave A

Leave D

Leave E

実行順序はわかりやすい ということだけ。パブリックの親クラス A は複数回実行されます。

コード 2:

>>> FooChild().bar("Hello, Python.")
Hello, Python.
ログイン後にコピー

結果:

E を入力

B を入力

C を入力

D


Aを入力

Aのまま

Dのまま

Leave C

Leave B

Leave E


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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!