この記事では、主に Python の super() メソッドを紹介します。このメソッドには特定の参照値があります。必要な友達はそれを参照してください。
super は、クラス名を直接使用して解決します。親クラスのメソッドは単一継承であれば問題ありませんが、多重継承となると検索順序(MRO)や繰り返し呼び出し(ダイヤモンド継承)など様々な問題が発生します。この記事では主に Python の super() メソッドに関する関連情報を紹介します。必要な方は参考にしてください。
はじめに
Python クラスには、新しいスタイルのクラスと古典的なクラスがあり、どちらも多重継承をサポートしています。クラスの継承では、親クラスのメソッドをオーバーライドするのではなく、親クラスのメソッドをオーバーライドする場合、Python 言語と C++ では、クラス定義の最初の self と同様のクラス継承を使用できます。 Python ではカスタマイズされ、C++ の this ポインターと同様に、オブジェクト自体を指します。
Python の単純なクラスの例:
>>> class hello(object): ... def print_c(): ... print"hello world!" >>> hello().print_c() hello world!
もちろん、実際には、通常は次のように、サブクラスが親クラスを継承することは避けられません。
Pythonでも super() メカニズムが提供されており、その例は次のとおりです:
>>> class child(hello): ... def print_c(self): ... hello().print_c() ... >>> child().print_c() hello world!
Note
Python2.2以前のバージョン: クラシッククラス時代クラシック クラスは継承のない型です。クラスとインスタンスの型はすべて型です。クラシック クラスが親クラスとして使用されている場合、サブクラスは親クラスのコンストラクターを呼び出すと、「TypeError: 型である必要があります。」というエラーを返します。 , classobj'''ではありません
現時点ではMROの方式はDFS(深さ優先探索(子ノードの順序:左から右))です。したがって、この記事では新しいスタイルのクラスが使用されており、新しいスタイルのクラスの検索アルゴリズムは C3 アルゴリズムです
>>> class hello(object): ... def print_c(self): ... print"hello world!" ... >>> class child(hello): ... def print_c(self): ... super(child,self).print_c() ... >>> child().print_c() hello world!
上記のコードでは、C が親クラス、D がサブクラスです. クラス D の minus メソッドを再定義しました。これは、C クラスの関数に基づいて print 'hello' 関数を追加することです。ここでの super の役割は、サブクラスで親クラスのメソッドを呼び出すことです。これは、単一継承で super() を呼び出す一般的な使用法でもあります。そこで質問です
class C(object): def minus(self,x): return x/2 class D(C): def minus(self,x): super(D, self).minus() print 'hello'
それでは、上記のコードの b.n の出力は何でしょうか?結果が 5 ではなく 2 なのはなぜですか? super(B,self).minus(m) は明らかに親クラスのマイナス メソッドを呼び出していますが、出力結果は 2 です。 B の現在のインスタンスは A のインスタンスではないため、self の値は.n が渡されました 10 ではなく 7 です
それでは、多重継承がある場合、super はどのように機能するのでしょうか?さあ、A を継承するクラス C を作成し、次に B と C を継承するクラス D を作成します。スーパーオーバーライドされたメソッドを呼び出す方法を見てください。
class A(object): def __init__(self): self.n = 10 def minus(self, m): self.n -= m class B(A): def __init__(self): self.n = 7 def minus(self, m): super(B,self).minus(m) self.n -= 2 b=B() b.minus(2) print b.n
上記のコードの出力結果は何でしょうか?焦らないで、まずはそれがどのように機能するかを確認してください。前述したように、新しいクラスは子ノードを検索するときに C3 アルゴリズムを使用します。では、それはどのようにして見つかるのでしょうか? D->B->C->A->オブジェクト。この注文が正しいことを確認するにはどうすればよいですか?
class C(A): def __init__(self): self.n = 12 def minus(self, m): super(C,self).minus(m) self.n -= 5 class D(B, C): def __init__(self): self.n = 15 def minus(self, m): super(D,self).minus(m) self.n -= 2 d=D() d.minus(2) print d.n
Mroとは何ですか?定義したクラスごとに、Python はクラス継承の順序を表すメソッド解決順序 (MRO) リストを計算します。
関連する推奨事項:
Pythonのsuper()関数の使用法と動作原理の詳細な説明以上がPythonのsuper()メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。