7.2継承と導出
7.21継承
1.何を継承していますか?継承サブクラスは、Pythonで複数の親クラスをサポートして継承し、道の新しい種類です。新しいクラスは、親クラスは、基本クラスを呼び出すことができるか、スーパークラスはサブクラス「遺伝」親クラスの属性、サブクラスまたは派生クラスと呼ばれています。
2、なぜ継承しなければならないコードの冗長性を削減
クラスParentClass1: パス・ クラスParentClass2: パス・ クラスSubclass1(ParentClass1): パス・ クラスSubclass2(ParentClass1、ParentClass2): 合格 プリントを(。Subclass1 __bases__) #(<クラスの。__ __main ParentClass1 '>、) プリント(。Subclass2 __bases__) #( <クラスの__main __。ParentClass1 '>、<クラスの__main __。ParentClass2'>)
図3は、クラスとクラスの継承関係は、抽象を再継承する必要があり、この関係を見つけることです
クラスOldboyPeople: 学校 = ' oldboy ' デフ__init__ (自己、名前、年齢、性別): self.name = 名前 self.age = 年齢 self.sex = セックスクラス OldboyTeacher(OldboyPeople): #继承OldboyPeople类デフchange_score(自己): プリント(' 教師%sはスコアを変化させている'%の)self.name クラス Oldboystudent(OldboyPeople): #继承OldboyPeople类 デフ(自己)を選択します: 印刷(' 学生%sのコースを選択し'%のself.name) tea1 = OldboyTeacher(' エゴン'、18、' 男性')#相当于OldboyTeacher .__のinit __(...) STU1 = Oldboystudent(' アレックス'、73 ' 女性' ) プリント(tea1.name、tea1.age、tea1.sex) #1 エゴン18雄 プリント(stu1.name、stu1.age、stu1.sex) #アレックス73メス
7.22 派生
派生:、新しいプロパティの独自のサブクラスを定義する同じ名前の場合は親クラスと、独自のサブクラスの対象
クラスOldboyPeople: 学校は = ' oldboy ' デフ __init__ (自己、名前、年齢、性別): self.name = 名前 self.age = 年齢 self.sex = セックス デフF1(自己): プリント(' 爹的F1 ' ) クラスOldboyTeacher(OldboyPeople): デフ __init__ (自己、名前、年齢、性別、レベル、給与): self.name = 名前 self.age = 年齢 self.sex =セックス self.level = レベル self.salary = 給与 DEFのchange_score(セルフ): 印刷(' 先生がスコアを変更している%S '%self.name) DEF F1(自己): 印刷(' 息子' F1 " ) TEA1 = OldboyTeacher(' エゴン'、18は、ある' 男性'、9,3.1) #は、入ってくる親ZEが与えられた場合、6つのパラメータが渡さ 印刷(tea1.name、tea1.age、tea1.sex、tea1.level、tea1.salary) #エゴン9 3.1 18 MALE
サブクラスに示す方法で7.23リユース機能新しい親クラス
一つの方法:名前で呼び出す(とは何の関係も継承されていません)
クラスOldboyPeople: 学校は = ' oldboy ' デフ __init__ (自己、名前、年齢、性別): self.name = 名前 self.age = 年齢 self.sex = セックス クラス OldboyTeacher(OldboyPeople): #可有可无 デフ __init__ (自己、名前、年齢、性別、レベル、給与): #1 self.name =名 #1 self.age =年齢 #self.sex =セックス OldboyPeople。__init__(自己、名前、年齢、性別)#OldboyPeople __init__マナーで親クラスの関数呼び出しを再利用 self.level = レベル self.salary = 給与 TEA1 = OldboyTeacher(' エゴン'、18は、' 男性'、9、3.1 ) を印刷(tea1.name、tea1.age 、tea1.sex、tea1.level、tea1.salary) #エゴン9 3.1 18 MALE
第二の方法:スーパー()の呼び出し(相続に厳密に依存)
スーパーは、()の戻り値は、特に親クラスのプロパティを起動する特別なオブジェクトである、スーパー()を見つけるために、現在の位置からリストを表示して下さいMROに厳密に従って、将来的に継続されます
学び:python2では、スーパーを必要とする(独自のクラス、自己に名前を付けます)
クラスOldboyPeople: 学校は = ' oldboy ' デフ __init__ (自己、名前、年齢、性別): self.name = 名前 self.age = 年齢 self.sex = セックス クラス OldboyTeacher(OldboyPeople): #必须有父类 デフ __init__ (自己、名前、年齢、性別、レベル、給与): スーパー(OldboyTeacher、自己)。__init__(名前、年齢、性別)#OldboyPeople .__のinit __(自己、名前、年齢、性別) self.level = レベル self.salary= 給与 tea1 = OldboyTeacher(' エゴン'、18 ' 男性'、9、3.1 ) プリント(tea1.name、tea1.age、tea1.sex、tea1.level、tea1.salary) #1 エゴン18男性9 3.1
7.3クラシックと新しいクラス
1、新しいクラス:継承されたオブジェクトクラスとクラスのサブクラスは、新しいクラスです
クラスは親クラスが指定されて継承していない場合は、すべてのクラスが新しいクラスをのpython3されるようにのpython3では、デフォルトでは、オブジェクトを継承します
2、クラシック(クラシックと新しいスタイルのクラスの間のみpython2で唯一の違い):クラスの継承されたオブジェクトクラスとサブクラスはありませんが、古典的なクラスであります
クラスはFoo(): #在するのpython3中の パスクラスバー(フー): 合格プリントを(。Fooの__bases__) #(<クラス'オブジェクト'>、)プリント(バー。__bases__) #(<クラスの__main__.Foo " >、)
多重継承の背景に7.34検索のプロパティ
不動産検索OBJに。Xを。1 、OBJを開始する。__dict__ 2 、クラスオブジェクト。__dict__ 。3 、親クラス。__dict__ ..........
継承関係は、分岐B、Cを見つける最初に従うものとし、その後分岐が、Dは最終的に私たちが望むプロパティを見つけるあなたまで、この程度の枝を見つけたことがわかります非ダイヤモンド構造である場合、
深さ優先と幅優先:継承はダイヤモンド型の構造である場合、その性質、すなわちを見つけるための2つの方法があります
印刷(F.の__mro__)#F.mro() #は、線形リストを見ることができますプロパティのこの新しいクラスを持って、プロパティは、このプロパティなしで、クラシックを順序を検索予約