まず、何を継承していますか?
継承は何の関係が何であるかを説明している2つのオブジェクト間の関係、次のとおりです。
新しいクラスが親クラスと呼ばれる基本クラスまたはスーパークラスを持っている1つまたはそれ以上の親クラスを継承することができ、新しいタイプは、派生クラスまたはサブクラス、単一および多重継承のpythonで呼ばれています
クラスベース: SERは = 「これは、基底クラスである」 DEF :show_info(セルフ) 印刷(self.ser) DEFのmake_money(セルフ): 印刷(「!ちょっとハードな一日を強制的に」) #親クラスビットベースの指定 クラス(サブクラスをベース): 渡し OBJ =サブクラス() #何もクラスが親を使用することができた場合でも、いくつかの集中管理、コンテンツがある obj.make_money() 印刷(obj.serを)
Bの連続、bは、既存のメソッドとプロパティで直接使用することができる:手順において、例えばクラスと、の間の継承関係に記載
ビューの継承:
印刷(サブクラス.__ bases__)
第二に、抽象化と継承:抽象的ではない明確で、具体的ではない、非常に混乱している
三つのクラス以上の親への抽出物の一部のような人間、豚、犬:抽象的には類似した以上の部分のように引き抜きますクラス。動物
継承の正しい使い方:
1、最初抽象的では継承し
、既存のクラスを継承し、2を本来の機能拡張や変更
継承が:抽象的な結果に基づいて、プログラミング言語は確かにこの抽象プロセスの最初の経験で、それを実装します相続の仕方によって抽象的構造を表現するためです。
#教師と生徒の同じ部分を抽出するには、クラスpersonフォーム クラスに人を: DEF __init__ (セルフ、名前、年齢、性別): self.name = 名前 self.age = 年齢 self.gender = 性別 DEF (自己を)say_hi: 印刷(" 名:%S、性別:%S、年齢:%のS "%(self.name、self.gender、self.age)) クラスの先生(人): #は 反復コードの削減に呼び出す #DEFティーチング(自己を): 印刷(" 眠気クラスの先生...!" ) T1 =教師("JSON " " 女性"20がある) t1.say_hi() クラスの学生(人): #の呼び出しは、同じ特性を備えて 合格 STU1 =学生(" リゾ" " 男性"18はあるが) stu1.say_hi() "コールサブクラスを「リピート少ないコードを作成する同じ年齢、名前、性別属性の親、
第三に、派生
サブクラスは異なるコンテンツの親クラスで発生した場合、それは派生クラスと呼ばれるサブクラス。
通常、サブクラスは、いくつかの新しいコードを記述します、と親は通常クラスを派生している、正確に同じにすることはできません、派生クラスは、サブクラスを参照します
クラスの人: DEF say_hi(自己): 印刷(" こんにちは" ) クラスの学生(人): デフsay_hi(自己): 印刷(" !こんにちは世界" ) STU = 学生() stu.say_hi()
カバーし、第四:
また、知ら書き換え:オーバーライドサブクラスは親クラスのプロパティやメソッドとまったく同じ名前を表示されます
検索順序の優先順位サブクラス属性は、この動作としても知られています覆盖
第五に、属性の順序を見つけます:
オブジェクト自体 - クラス>> - >>親見つける - 親クラスの親クラスを>> - >>オブジェクト(オブジェクト)
クラスA: テキスト = " heihei " クラスB(A): テキスト = " 笑" クラスC(B): テキスト = " dogdog " 合格 B = (B)を b.text = " あなたは大丈夫です" プリント(b.text ) C = C() c.text = " AABB " プリント(c.text) >> あなたは大丈夫です AABB
第六に、親クラスのサブクラスへのアクセスの内容
構文:スーパー()を呼び出し
モード1:
スーパー(現在のクラス名、自己)あなたは親クラスのプロパティやメソッドを転送する。
モード2:スーパー()新しい構文のプロパティまたはしたい親クラスのメソッドチューン#に最も一般的に使用されるの道2 PY3にアクセスします。道
モード3:あなたがチューン(セルフ)にしたい親クラスのプロパティやメソッドのクラス名。
#モード3は、継承とは何の関係もありません
クラス親: テキスト = " ABC " DEF (自己)say_something: 印刷(" 何か" ) クラスのSub(親): DEF show_info(セルフ): #の印刷(スーパー(サブ、セルフ)の.text) #スーパー(サブ、セルフ).say_something() #する最も一般的な方法PY3モード2にアクセスするための新しい構文 印刷(スーパー()。テキスト) スーパー()。()say_something #の直接3コールするクラス名を指定する方法 #印刷(Parent.text) #親を。 say_something(自己) サブ= サブ() sub.show_info() >>> どうして?
キー:
あなたがクラスを継承し、いくつかが表示され、親クラスのメソッドを__init__覆うと、最初に初期化メソッドで親クラスのラインを呼び出す必要があります
必要なパラメータを親に渡して初期化、(アプリケーションが特定の制限を必要とする場面)
クラスの学生(人):
__init __(自己、名前、性別、年齢、数)DEF:
スーパー().__ __ initの属性(名前、性別、年齢)#クラスフロント余分な番号が定義するために使用されなければならない
self.numberを=番号
需要:制限要素がコンテナ(辞書、リスト、タプル、集合、文字列の種類を実装する必要があるかもしれません
クラスMYLIST(リスト)の: DEF __init__ (セルフ、ELEMENT_TYPE): スーパー()__init__() #の初期化方法は、基本的な初期化が完了し、親クラスと呼ばれる self.element_type = ELEMENT_TYPE DEF :アペンド(セルフ、Object)を ""」 : objectパラメータ:格納される要素である リターン:なし 「」 " IF ==タイプ(オブジェクト)のself.element_type: #私たちは、実際のストレージ運用を行うために、親クラスのアペンド機能を訪問するためにここに必要がある スーパー(MYLIST、自己が)。 APPEND(オブジェクト) 他: 印刷(「SIR申し訳ありませんが、あなたがタイプ%Sの要素ではなく、」%self.element_type) #要素型が格納されるように指定されている作成 メートル= マイリスト(INT) #を使用すると、需要を持っているとき、どのようなことを行うには、初期化メソッドを期待するオブジェクトを作成する必要がある m.append( 1 ) 印刷( M [0]) m.append(" 121212 ")
あなたはスーパー()関数を使用すると、PythonはMROのリストの次のクラスを検索していきます。それぞれが統一super()を使用してメソッドを再定義し、一度だけ、それを呼び出した場合、
そして、制御の流れは、最終的にMROの完全なリストを横断します、それぞれの方法は一度だけ呼び出されます
(注注注:継承を経て、MROはリストを参照してくださいする必要があり、バック現在の場所のMROのリストから探して、コードを見ていない、スーパーの呼び出しのすべての属性を使用します)
#Aいいえ相続Bが、スーパーC.mro以内に基づいていますが()を探して次に進み 、クラスA: DEF テスト(自己): スーパー()テスト()。 クラスB: DEF テスト(自己): 印刷(" からB ' ) クラスC(A、B): 合格 C = C() c.test() #の印刷結果:Bのから プリント(C.mro()) #<クラス['。__ __main Cの'>、<クラスの__main __。A '>、<クラス' __main __。B '>、<クラスのオブジェクト「>]
七、の組み合わせ:
意味:合成データクラス属性としてオブジェクトの別のクラスへの1つのクラスにおいて呼び出さ
例:学生が携帯電話を持って、ゲームキャラクタは(つまり、何をどのような)特定のスキルを持っています
組み合わせ目的:既存のコードを再利用することです
継承を使用するときは:最後に2つのクラス間の関係の分析は、ありません:どのような関係とは何ですか
二つのクラスの間には有意な関係が存在しない場合は、同じに属さない:の組み合わせを使用するとき
八個のダイヤモンド継承:
追加:新しいスタイルのクラスとクラシック
任意のクラスでのpython3は、直接的または間接的にオブジェクトに継承されます
新しいクラスは、明示的または暗黙的なオブジェクトが呼び出された新しいクラスへのクラスから継承、新しいクラスのすべてがのpython3します
クラシックは、唯一python2で発生し、Objectのサブクラスでもありません
菱形继承 クラスA: J = 1 パス クラスB: #1 、J = 2つの パス クラスC(A): #J = 3つの パス クラスD(A): J = 4つの パス クラスE(B、C、D): #1 J = 5 パス D = E() プリント(DJ)
幅広の共通の親クラスに直面したダイヤモンドの継承、新しいクラス、第1の深さ、がある場合
新しいカテゴリは、深さ優先であります