ホームページ  >  記事  >  バックエンド開発  >  Python における多重継承の詳細な分析

Python における多重継承の詳細な分析

巴扎黑
巴扎黑オリジナル
2017-08-11 15:35:361914ブラウズ

この記事では主に Python の多重継承の理解に関する関連情報を紹介します。多重継承は理解するのが簡単ではありません。必要な方は

の多重継承を理解するのに役立つ例を紹介します。

Python は、C++ と同様に、多重継承をサポートしています。概念は簡単ですが、難しい作業は、サブクラスがそれ自体で定義されていない属性を呼び出す場合、特に多くの親クラスに同じ属性が含まれている場合、どのような順序で親クラスにアクセスしてその属性を見つけるかということです。名前。

従来のクラスと新しいスタイルのクラスでは、属性の検索順序が異なります。ここで、クラシック クラスと新しいクラスの 2 つの異なるパフォーマンスをそれぞれ見てみましょう:

クラシック クラス:


#! /usr/bin/python
# -*- coding:utf-8 -*-

class P1():
 def foo(self):
  print 'p1-foo'

class P2():
 def foo(self):
  print 'p2-foo'
 def bar(self):
  print 'p2-bar'

class C1(P1,P2):
 pass

class C2(P1,P2):
 def bar(self):
  print 'C2-bar'

class D(C1,C2):
 pass


if __name__ =='__main__':
 d=D()
 d.foo()
 d.bar()

実行結果:


p1-foo
p2-bar

コード例の図を描くわかりやすいように:

上記の古典的なクラスの出力結果から判断すると、

インスタンス d が foo() を呼び出したとき、検索順序は D => C1 => P1 となり、

インスタンス d が bar( )、検索順序 順序は D => C1 => P2 です

概要: 古典的な検索方法は、「左から右、深さ順」で属性を検索することです。 d は、最初に foo メソッドがあるかどうかを検索し、存在しない場合は、そのメソッドが最も近い親クラス C1 に存在するかどうかを検索します。存在しない場合は、メソッドが P1 で見つかるまで検索を続け、検索は終了します。 。

新形式クラス:


#! /usr/bin/python
# -*- coding:utf-8 -*-

class P1(object):
 def foo(self):
  print 'p1-foo'
  
class P2(object):
 def foo(self):
  print 'p2-foo'
 def bar(self):
  print 'p2-bar'
  
class C1(P1,P2):
 pass
 
class C2(P1,P2):
 def bar(self):
  print 'C2-bar'
  
class D(C1,C2):
 pass 
 

if __name__ =='__main__':
 print D.__mro__ #只有新式类有__mro__属性,告诉查找顺序是怎样的
 d=D()
 d.foo()
 d.bar()

実行結果:


(<class &#39;__main__.D&#39;>, <class &#39;__main__.C1&#39;>, <class &#39;__main__.C2&#39;>, <class &#39;__main__.P1&#39;>, <class &#39;__main__.P2&#39;>, <type &#39;object&#39;>)

p1-foo
C2-bar

上記新形式クラスの出力結果より、

インスタンス d が foo() を呼び出したときの検索順序is D => ; C1 => C2 => P1

インスタンス d が bar() を呼び出すとき、検索順序は D => Go でプロパティを見つけます。

以上がPython における多重継承の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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