ホームページ >バックエンド開発 >Python チュートリアル >Lao Qi から Python の 3 つのサブクラスの書き方を学ぶ

Lao Qi から Python の 3 つのサブクラスの書き方を学ぶ

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-16 08:41:101028ブラウズ

クラスについては、読者の皆さんはすでに感じているはずです。以下のコードをよく読んで、何か問題がないか確認してください。

コードをコピー コードは次のとおりです:

#!/usr/bin/env python
#coding:utf-8

クラスの人:
Def __init__(自分自身、名前、言語、電子メール):
self.name = 名前
self.lang = lang
self.email = メール

デフォルトの作成者(自分):
self.name

を返す

クラスプログラマー:
Def __init__(自分自身、名前、言語、電子メール、システム、ウェブサイト):
self.name = 名前
self.lang = lang
self.email = メール
self.system = system
self.website = ウェブサイト

def Python(self):
pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
pythoner_list を返す

if __name__=="__main__":

Writer = 人("qiwsir","中国語","qiwsir@gmail.com")
python = プログラマー("qiwsir","Python","qiwsir@gmail.com","Ubutun","qiwsir.github.io")
Print "私の名前は:%s"%writer.author()
Print "私はプログラムを作成します:%s"%python.pythoner()[1]

上記のコードは問題なく実行されますが、よく見ると 2 つのクラスがあり、1 つは person という名前で、もう 1 つは Programmer という名前のクラスです。これは問題ではありません。これら 2 つのクラスは、関数内に同じ場所があります: self.name=name、self.lang=lang、self.email=email。これは通常、コードの品質を追求するプログラマーには許可されません。重複したコードや冗長なコードを使用しないことが最善です。しかし、両方のクラスにこれらのパラメータが必要な場合はどうすればよいでしょうか?

サブクラス、親クラス、継承

以下のコードを見てください。クラス A と B の 2 つがあります。このプログラムは正しく実行でき、各クラスの機能は指定されたコンテンツのみを出力することです。


コードをコピー コードは次のとおりです:
#!/usr/bin/env python
#coding:utf-8
クラス A:

Def __init__(self):
print "aaa"

クラス B:

Def __init__(self):
print "bbb"
if __name__=="__main__":

a = A()

b = B()

#実行結果

ああ

bbb


上記の 2 つのクラスの間には、いわゆる親子関係はありません。ここで少し変更を加えてクラス B を書き直します。上記との違いに注意してください。


コードをコピー コードは次のとおりです:#!/usr/bin/env python #coding:utf-8

クラス A: Def __init__(self):

print "aaa"

class B(A): #上記のプログラムとは異なります。 B は A

を継承します Def __init__(self):

print "bbb"

if __name__=="__main__":

a = A()

b = B()

#実行結果

ああ

bbb


このプログラムでは、クラス B は前のプログラムとは少し異なります。クラス B(A): は次のように記述され、B と A の関係を示します。B は A のサブクラスであり、B は A から A を継承します。すべて(息子は父親から継承します)。

しかし、関係者が気づいても気づかなくても、実行結果は同じです。はい、それは、B が A を相続しますが、A からは何も呼び出さないことを意味します。これは、息子が父親から富を相続するのと同じですが、息子は一銭も動かないのです。外の世界では、相続が存在しないように見えます。


コードをコピー コードは次のとおりです: #!/usr/bin/env python
#coding:utf-8

クラス A: Def __init__(self):

print "aaa"

クラス B(A):

Def __init__(self):

#print "bbb"
A.__init__(self) #継承された親クラスを実行します

if __name__=="__main__":

a = A()

b = B()

#実行結果

ああ

ああ


今回は実行結果が変わりました。元々 b=B() はクラス B を実行していましたが、B は A を継承し、初期化コンストラクターに A のコンストラクターを導入したため、A を実行した結果が Result に対応します。

サブクラス継承を使用して最初のプログラムを書き直してみましょう。

コードをコピー コードは次のとおりです:

#!/usr/bin/env python
#coding:utf-8

クラスの人:
Def __init__(自分自身、名前、言語、電子メール):
self.name = 名前
self.lang = lang
self.email = メール

デフォルトの作成者(自分):
self.name
を返す """
クラスプログラマー:
Def __init__(自分自身、名前、言語、電子メール、システム、ウェブサイト):
self.name = 名前
self.lang = lang
self.email = メール
self.system = system
self.website = ウェブサイト

def Python(self):
pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]
pythoner_list を返す """

クラス プログラマー(人): #親クラス 人を継承

Def __init__(自分自身、名前、言語、電子メール、システム、ウェブサイト):
Person.__init__(self,name,lang,email) #ここに Person.__init__() の関数を継承します
#Self.name = name #これら 3 つの文は person で記述されているため、
を繰り返す必要はありません #self.lang = lang #これら 3 つの文の機能は継承によって実現されています
#self.email = メール
self.system = システム self.website = ウェブサイト

def Python(self):

pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ]

pythoner_list を返す
if __name__=="__main__":
Writer = 人("qiwsir","中国語","qiwsir@gmail.com")

python = プログラマー("qiwsir","Python","qiwsir@gmail.com","Ubutun","qiwsir.github.io")

Print "私の名前は:%s"%writer.author()
Print "私はプログラムを作成します:%s"%python.pythoner()[1]



コードを実行した結果は前と同じです。

サブクラス、親クラス、継承の特徴を理解していますか?父親が高級官僚や富豪であれば、あなたは二世官僚や二世の富豪となり、彼らから多くの富を相続することになるので、人生で頑張りすぎなければなりません。これが継承の役割です。コードでも同様に、継承によってコード作成者の疲労が軽減されます。

継承が使用される理由については、私の友人 @linghuchongdaxia が非常に素晴らしい説明をしてくれました:

コードをコピー

コードは次のとおりです: 技術的に言えば、OOP における継承の主な目的はポリモーフィズムを実現することです。ポリモーフィズムの場合、重要なのはインターフェイスの継承であり、プロパティと動作の継承があるかどうかですが、これは必ずしも当てはまるわけではありません。実際、エンジニアリングの実践では、大量の動作の継承が過度に複雑で肥大化したシステムにつながり、その結果柔軟性が低下することが示されています。そこで現在提唱されているのが、インターフェースをベースとした軽量継承の考え方です。このモデルでは、親クラス (インターフェイス クラス) にコードがまったくないため、コードの再利用はまったくありません。

Python では Duck Type の存在により、インターフェース定義の重要性が大幅に低下し、継承の役割がさらに弱められています。

さらに、論理的に言えば、継承の目的はコードを再利用することではなく、関係を整理することです。

私は上記の説明に完全に同意します。しかし、読者が理解できなくても、上記の説明の精神はプログラミングの実践を通じて理解する必要があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。