Pythonのsuper()メソッド

不言
不言オリジナル
2018-06-01 16:36:221615ブラウズ

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

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