承継
親クラスは、ベースクラスとして知られているように現実の父と息子、孫、ひ孫と、とクラスの継承
Pythonでの継承は、単一および多重継承に分割されています
父クラス: 渡し クラスの母を: 渡し クラス息子(父):#単一継承 パス クラス息子(父、母):#多重継承を(二つ以上のことができます) 峠
サブクラスは、親クラスのすべてのクラス属性を統合します
クラス父: お金= 100 デフ__init __(自己、名前、年齢): self.name =名前 self.age =年齢 デフplay_son(自己): 印刷( "%sの正在打儿子" %self.name) クラス息子(父): 合格 F1 =父( "蔡徐坤"、 "30")、 印刷(Son.money) Son.play_son(F1)
子クラスは親クラスと同じ名前の属性を定義し、値の彼らの定義が優先されている場合
クラス父: お金= 100 デフ__init __(自己、名前、年齢): self.name =名前 self.age =年齢 デフplay_son(自己): 印刷( "%sの正在打儿子" %self.name) クラス息子(父): お金= 10 デフplay_son(): プリント( "测试") F1 =父( "蔡徐坤"、 "30") プリント(Son.money) Son.play_son()
息子は、例えば、init関数を、次のされていないので、それがトリガー子が親クラスのinitを継承するときにインスタンス化するので、2つのパラメータを渡す必要されます
父クラス: お金は= 100 DEF __init __(自己、名前、年齢): self.name =名前 self.age =年齢 DEFのplay_son(セルフ): 印刷(%のself.name "%Sはの息子を再生している") クラス息子(父): マネー= 10 F1 =父( "カイ徐くん"、 "30") を印刷(Son.money) トリガ子が親クラスのinitを継承するときにインスタンス化S1 =息子( "彼"、 "18")#、それは二つの引数が必要です 印刷(s1.name) 印刷(S1 .__ dict__にマジック) 印刷(息子.__ dict__に魔法を)
第二に、とき継承を使用するには?
場合と有意に異なる、より良いと組み合わせて、クラス間の必要なときに小さなクラス1のより大きなクラスの構成要素であります
これらの共通の特徴を抽出するためのクラスが基本クラスを作成すると、同じ機能の多くは、2の間にあり、継承が優れています
派生:
親クラスを継承し、派生と呼ばれる、独自のユニークな機能を持っているクラス
継承はまた、2つの意味があります。
図1に示すように、基本クラスのメソッドを継承し、自分の変更や拡張(コードの再利用)を作ります
#有害でさえ少し意義のこの連続を、それが基底クラスのサブクラスは、コードブロック間の強い結合の可能性のある独立したように、より頻繁に発生できるため
2、サブクラスはインターフェースクラスを定義し、特定の基底クラスと互換性宣言、サブクラスはインターフェース、インターフェースで定義されたメソッドの実装を継承します
第三に、インターフェイスの継承[]
概念:デコレータの方法を使用して、基本クラスがインターフェイス関数に独自の方法を定義するための基本クラスを定義し、
限り、サブクラスがそれに継承するように、ベースクラスが実装する必要があります。
インターフェース:ある関数やメソッド
メソッドのインタフェースは、実現が、サブクラスを標準化するためではありません。
ABCのモジュールを導入することにより、サブクラスの力は、誤差基底クラスと一致しているし、そうでない場合必要があります!
輸入のABC クラスAll_file(メタクラス= abc.ABCMeta): @ abc.abstractclassmethod デフ読んで(自己): パス @はabc.abstractclassmethod デフ書き込み(自己): パス・ クラスのディスク(All_file): デフ(自己)読み: プリント( 'ディスク')読み )デフ自己(書き込み: プリント('ディスク書き込み') クラスCDROM(All_fileを): デフ自己(読み込み): プリントを(' cdromは)「読み取り 函数此处少定义一个書く#、所以会报错 C1 = CDROM ()
ディスクおよびクラスの基底クラス、通常の通話と一致した方法
輸入のABC クラスAll_file(メタクラス= abc.ABCMeta): @ abc.abstractclassmethod デフ読んで(自己): パス @はabc.abstractclassmethod デフ書き込み(自己): パス・ クラスのディスク(All_file): デフ(自己)読み: プリント( 'ディスク読ん') デフ(自己を)書く: プリント('ディスク書き込み') クラスCDROM(All_file): デフ(自己を読んで): プリント(' cdromは「読み取り) 、D1 =ディスク() d1.read()
第四に、連続の順序
1. 2.幅優先深さ優先:連続の順序は、2つのタイプに分かれています
いいえ、基本クラスの継承は、クラシックと呼ばれていません
基底クラス継承オブジェクトは、新しいクラスと呼ばれます
python 3では、すべての新しいクラス、幅優先の新しいクラス
クラスA:#基の类の DEF試験(SSLF): プリント( 'A') 、クラスB(A): DEF試験(自己): プリント( 'B') クラスC(A): DEF試験(自己): プリント( 'C') 、クラスD(C): DEF試験(自己): プリント( 'D') クラスE(C): DEF試験(自己): プリント( 'C') クラスF(D、E): DEF試験(自己): プリント( 'F') F1 = F() f1.test()
あなたがテストメソッドを呼び出すと、自分自身で始まることは、それを見つけ、探し継承された親クラスを探し始めた、幅優先の新しいクラス
F ---> D ---> B ---> E ---> C ----> A
承継の順序を確認するにはビルトインの方法
最終的にはPythonは継承を実装する方法で、ユーザーが定義した各クラスのために、Pythonは、分析法(MRO)のリストを算出し、
MROのリストには、すべての基本クラスの単純な線形列のリストです
それは、このプロパティクラスの最初の一致が見つかるまで、継承を実現するためには、PythonはMROの基本クラスリストの左から右に見て開始します。
このリストは、MROは、線形アルゴリズムC3によって達成されて構成されています。私たちは、実際に、このアルゴリズムの数学的な原則にそれを行っていません
MROは、すべての親クラスのリストをマージして、次の3つのルールに従うことです。
1.サブクラスは親の前にチェックされています
2.リスト内の順序に基づいて、親クラスの複数がチェックされています
3.次の授業のための2つの法的オプション、最初の親を選択するがある場合
印刷(F .__ mro__)
python2では、古典のサブカテゴリは、古典的なクラス継承深さ優先あります
即:F ---> D ----> B ---> A ----> E -----> C