前回の講義のコードをベースに、さらに修正を加えた次のプログラムになります。
を読んで勉強してください。
クラスの人:
Def __init__(自分、名前、電子メール):
self.name = 名前
self.email = メール
クラス プログラマー(人):
Def __init__(自分自身、名前、電子メール、言語、システム、ウェブサイト):
person.__init__(自分,名前,メールアドレス)
self.lang = lang
self.system = system
self.website = ウェブサイト
クラス Pythoner(プログラマ):
Def __init__(自分,名前,メールアドレス):
Programmer.__init__(self,name,email,"python","Ubuntu","qiwsir.github.io")
if __name__=="__main__":
Writer = Pythoner("qiwsir","qiwsir@gmail.com")
「name=,writer.name
」を印刷します
印刷 "lang=",writer.lang
「email=,writer.email
」を印刷します
「system=,writer.system
」を印刷します
「website=,writer.website
#実行結果
名前= qiwsir
lang=python
メールアドレス= qiwsir@gmail.com
システム= Ubuntu
ウェブサイト= qiwsir.github.io
結果には非常に満足しています。プログラム内の継承関係を見てみましょう: Pythoner <-- Programmer <-- person 上記のプロセスから、継承によってコードの重複が削減されることがわかります。コードをより簡潔にします。また、継承時に関数内のパラメータにデフォルト値を割り当てることもできます。
継承の問題の調査を強調するために、実験には引き続き単純なクラスを使用します。
エクストラB
クラス A:
Def __init__(self):
print "aaa"
クラス B(A):
パス
if __name__=="__main__":
a = A()
b = B()
#実行結果
ああ
ああ
B は A を変更せずに継承するため、B は何も書く必要がないか、B は本質的に冗長です。実際のプログラミングプロセスでは、このようには記述されません。これは、読者に継承の意味を示すためです。
#!/usr/bin/env python
#coding:utf-8
クラス A:
Def __init__(self):
print "aaa"
クラス B:
Def __init__(self):
print "bbb"
クラス C1(A,B):
パス
クラス C2(B,A):
パス
if __name__=="__main__":
「A--->」を印刷します、
a = A()
「B--->」を印刷します、
b = B()
Print "C1(A,B)--->",
c1 = C1()
Print "C2(B,A)--->",
c2 = C2()
#実行結果
あ--->ああ
B---> bbb
C1(A,B)--->ああ
C2(B,A)--->bbb
クラス C1 は 2 つのクラス A と B を継承し、クラス C2 も 2 つのクラスを継承しますが、書き込み順序が少し異なることに気づきました (B, A)。実行結果から、サブクラスが複数の親クラスを継承する場合、最初のコンストラクター __init__() のみを継承でき、2 番目のコンストラクターは待機することがわかります。したがって、通常の状況では、プログラム内でコンストラクターの同時多重継承は行われませんが、以前のより現実的なコードと同様に、リレー継承は行うことができます。
他のメソッドの継承
クラス A:
Def __init__(self):
print "aaa"
定義メソッド(自分):
print "メソッド a"
クラス B(A):
Def __init__(self):
print "bbb"
if __name__=="__main__":
「A--->」を印刷
a = A()
a.amethod()
「B--->」を印刷
b = B()
b.amethod()
#実行結果
A--->
ああ
メソッド a
B--->
bbb
メソッド a
上記の状況を説明するために、私は絵を描きましたが、描き終わった後、この絵を見てさらに混乱したように見えました。どうしても描いてしまいましたが、理解の助けになれば幸いです。
A のインスタンスと呼び出しについては詳しく説明しません。 B に注目します。クラス B は A を継承します。同時に、B はコンストラクター内で独自の規定を作成しました。つまり、B のコンストラクターは B の希望に従って実行され、A の内容は実行されません。ただし、A には、 amethod(self ) メソッドの場合、B はこのメソッドを継承します。このメソッドがクラス B のインスタンスを通じて呼び出されると、成功します: b.amethod()
メソッドの継承と呼び出しです。
いわゆる継承とは、対応する継承オブジェクトを最下位から最上位に探し、見つかったらそれを継承することです。同じ名前のものがあった場合はどうなりますか?どのような順序で検索すればよいでしょうか?
アプリケーション Web サイトの一文:
Pythonでは多重継承が可能ですので、このとき、サブカテゴリから検索し、左から右に同じ階層の親カテゴリを検索するという順序に注意してください。同じレベルの上位の親カテゴリを左から右に検索し、最上位のレベルに到達します。
コード例:
def メソッド 2(self):
print('A.method2')
クラス B(A):
定義メソッド3(自分):
print('B.method3')
クラス C(A):
定義メソッド2(自身):
print('C.method2')
def メソッド 3(self):
print('C.method3')
クラス D(B, C):
定義メソッド4(自身):
print('C.method4')
d = D()
d.method4() # D、C.method4
で見つかりました
d.method3() # D->B の順序で見つかりました、B.method3
d.method2() # D->B->C の順序で見つかり、C.method2
d.method1() # D->B->C->A の順序で見つかり、A.method1
必ず実際の学習者に各クラスの各メソッドを比較してもらい、対応する出力結果を順番に見つけてもらいます。継承の順序を理解するため。学習には少しずつの積み重ねが必要です。