ワン:オブジェクト指向の継承とは何ですか?
比較公式声明は次のとおりです。
継承(英語:継承は)の間で、オブジェクト指向ソフトウェア技術の概念です。別のカテゴリB「から継承された」カテゴリAは、Aを入れた場合は、「サブカテゴリーB」と呼ばれ、Bは「カテゴリAの父」と呼ばれても、「AのBは、スーパークラスである。」と呼ぶことができます 継承は、再び同じコードを記述することなく、様々なサブカテゴリのような性質や親クラスのメソッドを持つことができます。玲子のカテゴリは親クラスを継承しながら、あなたはとても親カテゴリ別の関数を取得するには、特定の属性を再定義し、いくつかのメソッド、プロパティと覆われている元の親カテゴリのメソッドをオーバーライドすることができます。また、サブカテゴリ、追加の新しいプロパティとメソッドのために、それはまた、一般的に行われています。一般的な静的なオブジェクト指向プログラミング言語、実施期間中に展開することはできません、サブカテゴリーの行動にコンパイルすることを決定してきた意味、静的に継承されました。
文字通り意味:彼の父の足跡、家族の財産の法的後継者を、何もあなたが唯一の子ではない、とあなたは非常に従順であればつまり、あなたがすべての財産あなたの両親を継承し、すべてのプロパティが(放蕩子を除く)あなたが使用します。
だから、例を見て継承されました:
コードの表示
継承少し明らかです。
1クラスの結合の増加(適切でない結合は、微細であるべきです)。
図2に示すように、繰り返しコードを減らします。
図3は、合理化、コードはより標準になります。
カテゴリー2継承。
上記の例の場合:
アミナールは、親クラス、基底クラス、スーパークラスと呼ばれます。
人猫犬:サブクラスで、派生クラス。
継承:に分けることができる単一継承、多重継承。
私たちは、Pythonでのクラス(必要を継承)種を追加する必要があります:
python2xバージョンでは2つのクラスがあります。
⼀と呼ばれるクラシックのpython2.2前⼀何も書かないためにあればストレート古典的で古典的なルートベースクラスクラスクラスを使用して....
⼀と呼ばれる新しいカテゴリでを。 python2.2は、新しいクラスの後に登場しました。新機能は、ルートクラスは、オブジェクトクラスの基本クラスです。
:python3xバージョンは唯一のクラスである
操作ののpython3を使用している新しいクラスクラスオブジェクトを継承しない基本クラスがデフォルトで継承する場合。
第三に、単一継承。
3.1クラス名、オブジェクトの親クラスのメソッドを実行します
クラス名、オブジェクトはそれぞれ、親クラスのメソッドを呼び出します
3.2実行順序
実行順序
3.3クラスと親クラスメソッドを行いながら
この方法の一つ:
あなたは親クラスのFUNCメソッドを実行したい場合は、この方法と夜の使用をサブクラス化し、サブクラスのメソッドに記述します。
.FUNC親クラス(他のパラメータを物体)
例えば:
class Aniaml(object):
type_name = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print('吃东西')
class Person(Aniaml):
def __init__(self,name,sex,age,mind):
'''
self = p1
name = '春哥'
sex = 'laddboy'
age = 18
mind = '有思想'
'''
# Aniaml.__init__(self,name,sex,age) # 方法一
self.mind = mind
def eat(self):
super().eat()
print('%s 吃饭'%self.name)
class Cat(Aniaml):
pass
class Dog(Aniaml):
pass
# 方法一: Aniaml.__init__(self,name,sex,age)
# p1 = Person('春哥','laddboy',18,'有思想')
# print(p1.__dict__)
# 对于方法一如果不理解:
# def func(self):
# print(self)
# self = 3
# func(self)
方法2:
スーパー、スーパー()。のFunc(パラメータ)を使用して、
class Aniaml(object):
type_name = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print('吃东西')
class Person(Aniaml):
def __init__(self,name,sex,age,mind):
'''
self = p1
name = '春哥'
sex = 'laddboy'
age = 18
mind = '有思想'
'''
# super(Person,self).__init__(name,sex,age) # 方法二
super().__init__(name,sex,age) # 方法二
self.mind = mind
def eat(self):
super().eat()
print('%s 吃饭'%self.name)
class Cat(Aniaml):
pass
class Dog(Aniaml):
pass
# p1 = Person('春哥','laddboy',18,'有思想')
# print(p1.__dict__)
単一継承演習:
コードの表示
第四に、多重継承
class ShenXian: # 神仙
def fei(self):
print("神仙都会⻜")
class Monkey: # 猴
def chitao(self):
print("猴⼦喜欢吃桃⼦")
class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是⼀只猴
pass
sxz = SunWukong() # 孙悟空
sxz.chitao() # 会吃桃⼦
sxz.fei() # 会⻜
この時点で、猿王は猿⼀のサブメニューですが、また神を⼀。モンキーは、これら2つのカテゴリーを受け継いこと。猿自然な色が救済のこれら2つのクラスを実行することができます。多重継承を使用することも非常に良いシンプルです理解が、多重継承、2つの⽗クラスが同じ名前の救済時に登場した問題は。⼀とてもあります。それを行うには、その後どのように?それはカメラのために、このような⼀⽗クラスメソッドを見つける方法に来ます質問。MRO(メソッド解決順序)問題という。⼀PythonでPythonの操作の異なるバージョンの使用は、MROを完了するために、異なるアルゴリズムであるため、これは非常に複雑な問題です。
私たちは、Pythonでのクラス(必要を継承)種を追加する必要があります:
python2xバージョンでは2つのクラスがあります。
⼀と呼ばれるクラシックのpython2.2前⼀何も書かないためにあればストレート古典的で古典的なルートベースクラスクラスクラスを使用して....
⼀と呼ばれる新しいカテゴリでを。 python2.2は、新しいクラスの後に登場しました。新機能は、ルートクラスは、オブジェクトクラスの基本クラスです。
:python3xバージョンは唯一のクラスである
操作ののpython3を使用している新しいクラスクラスオブジェクトを継承しない基本クラスがデフォルトで継承する場合。
多重継承は4.1クラシックです
そこにはクラシックでのpython3ではありません。しかし、より良いMRO'd古典的なクラスはこれが⼀ツリートラバーサル⼀最も簡単な例一種である。⼀学校を学びますが。我々はpythonでクラス継承階層に置くことができます:⼀さDPI、コードにクラス継承ツリー構造
サンプルコード
MROは、この図面に対処することができます。
継承図は、古典的なカテゴリでは深さ優先探索を使用して記録されている⽅場合。深さ、最初は何ですか。⼀道路は終わりに近づいている。覚えておいてください⼀原理を?どのようにそれを見つける⾏に。持っている。そして、戻ってきます次のいずれかを記録するために探し続けています。
あなたの最も下のコネクタに送信する権利に卵を送信するために指示こと。矢印と黒と行の表に表示される行。各円は、卵のアドレスを送信する準備ができている図⾯R.と、それを送信するためにどのようにして。残されなければなりませんか?
確かに送信するための順123456に示す図である。この順序は深さ優先探索と呼ばれていること。⽽それは142356ですか?これはわかりました。ワイドの-最初トラバーサルと呼ばれている。あまりにも多くの深さ優先。そして、 ⾯それを見つける方法についてのマップ?MROは?非常に簡単です何が。それを忘れないでください。左から右にキズ。⼀道路頭を走った後、戻って。道路は頭を行ってきました⼀続ける。MROアルゴリズムは古典的なクラスであります。
クラスMRO:Foo-> H - > G - > F - > E - > D - > B - > A - > C.あなたはそれを得ましたの?
4.2多重継承の新しいクラス
4.2.1 MROシーケンス
MROは、クラスはそれが計算され作成されたとき、順序付けられたリストのLです。
一般式は次のとおりです。
mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )(其中Child继承自Base1, Base2)
基本クラスが継承する場合:クラスB(A)
時系列B MROであります
mro( B ) = mro( B(A) )
= [B] + merge( mro(A) + [A] )
= [B] + merge( [A] + [A] )
= [B,A]
もし基底クラスの複数の後継:クラスB(A1、A2、 A3 ...)
この時系列BのMRO
mro(B) = mro( B(A1, A2, A3 …) )
= [B] + merge( mro(A1), mro(A2), mro(A3) ..., [A1, A2, A3] )
= ...
例[A1、A2、A3]と同様にリスト、すなわち、クラス自体の少なくとも一つの要素のリスト、などの結果。マージ操作は、コアC3アルゴリズムです。
4.2.2ヘッダーとフッター。
ヘッダー:
リストの最初の要素
フッタ:
設定テーブルのリストの先頭以外の元素(空であってもよいです)
例
リスト:[A、B、C]
ヘッダ、B及びCフッタであります
リスト+間の4.2.3操作
+演算子:
[A] + [B] = [A、B]
(デフォルトの計算が示されています)
---------------------
動作例をマージ:
如计算merge( [E,O], [C,E,F,O], [C] )
有三个列表 : ① ② ③
1 merge不为空,取出第一个列表列表①的表头E,进行判断
各个列表的表尾分别是[O], [E,F,O],E在这些表尾的集合中,因而跳过当前当前列表
2 取出列表②的表头C,进行判断
C不在各个列表的集合中,因而将C拿出到merge外,并从所有表头删除
merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
3 进行下一次新的merge操作 ......
---------------------
計算MRO(A)によって:
mro(A) = mro( A(B,C) )
原式= [A] + merge( mro(B),mro(C),[B,C] )
mro(B) = mro( B(D,E) )
= [B] + merge( mro(D), mro(E), [D,E] ) # 多继承
= [B] + merge( [D,O] , [E,O] , [D,E] ) # 单继承mro(D(O))=[D,O]
= [B,D] + merge( [O] , [E,O] , [E] ) # 拿出并删除D
= [B,D,E] + merge([O] , [O])
= [B,D,E,O]
mro(C) = mro( C(E,F) )
= [C] + merge( mro(E), mro(F), [E,F] )
= [C] + merge( [E,O] , [F,O] , [E,F] )
= [C,E] + merge( [O] , [F,O] , [F] ) # 跳过O,拿出并删除
= [C,E,F] + merge([O] , [O])
= [C,E,F,O]
原式= [A] + merge( [B,D,E,O], [C,E,F,O], [B,C])
= [A,B] + merge( [D,E,O], [C,E,F,O], [C])
= [A,B,D] + merge( [E,O], [C,E,F,O], [C]) # 跳过E
= [A,B,D,C] + merge([E,O], [E,F,O])
= [A,B,D,C,E] + merge([O], [F,O]) # 跳过O
= [A,B,D,C,E,F] + merge([O], [O])
= [A,B,D,C,E,F,O]
---------------------
C3は、我々は複数のクラスに行って最後まで滞在の共通の遺産である、我々はまた、図から、関連する法律を見に来ることができるようになる..しかし、一般的な継承のようなもの。それは慣れほぼ同じ深いトラバーサルを取得しますが、ない場合を関連付けますその上