何回も挫折しているクラスに再挑戦 ⑥

Python寺子屋も小学部は卒業して中等部に入学です。

いままで何回もtryしたクラスの作成ですが、すぐ挫折してましたのこんどは腰を据えて頑張ってみます。

 

全ての言語に関数(合計するとかソートするとか)が有りますが、Pythonにも使い回しができるクラス(class)という関数があります。 random, label, Buttonとか云うのもクラスなのです。 そういったクラスを自分で作りましょうというのが今回の課題です。

全くのクラス素人ですので時間がかかりそうですが、痴呆防止に役に立ちますのでやってみましょう。

———————————————–

① Carと云うクラス(金型)をまず作る

class Car():
    def __init__(self, make, color): #__init__は特殊メソッドと呼ばれる
        self.make = make #インスタンスと呼ばれる(金型から作られる車のメーカーを指定する)
        self.color = color

myCar = Car(‘Toyota’, ‘white’) #前出のselfはこの場合はmyCarと同じことです

print(myCar.make, myCar.color)#myCarという車のメーカーと色を表示する

 

runすると次のように表示される。 
金型から出来た車(myCar)は、メーカーはToyotaで色はwhiteということになります。

======クラス作成1.py =======
Toyota white

 

————————————————

次に少し製品の数を増やしてみます。

② 車クラスと云う親クラスを作ります。 ここでは見やすい・分かり易いように全角日本語も入れております。
  親クラスは、これから作る何かの設計図であるとか、金型であるとか説明されます。 

#クラス作成1.py 11/15/2019

class 車: #親クラス(スーパークラス)
    def __init__(self, メーカー, 色): #親クラスの一般的な性格を指定する(親の性格はまだ指定されていない)
        self.メーカー = メーカー #子の性格(spec)を後で決める 
        self.色 = 色
  #selfとは、金型から作られる製品のことになります。

#ここで出来る車の性格を決める
遠藤車 = 車(“日産”, “赤”) #遠藤さんのクルマは、日産で赤色ですと指定してます。
河野車 = 車(“トヨタ”, “青”)

#その車の仕様を表示する
print(遠藤車.メーカー, 遠藤車.色) #遠藤車のspecです
print(河野車.メーカー, 河野車.色)

runすると以下のように、遠藤さんと河野さんの車の仕様(spec)が表示されました。

#===== クラス作成1.py ========
#日産 赤
#トヨタ 青
#>>>

———————————————–

 

③ 親クラスの仕様を少し変更する(上書き=書替え=オーバーライド)

class 車: #親クラス(スーパークラス)
    駆動方式 = ‘4駆’  #クラス変数(親子共通)の定義。クラスのすぐ下に書く。
    def __init__(self, メーカー, モデル, 色):#メーカー、モデル、色を製品に設定する変数(クラス変数)
        self.メーカー = メーカー
        self.モデル = モデル
        self.色 = 色

    def 新しい色(self, new_iro): #製品出来る車に新しい色を定義しなおす、new_iroで書き換える
        self.色 = new_iro

遠藤 = 車(“日産”,”リーフ”,”赤”) #遠藤さんの車のspecです 
河野 = 車(“トヨタ”,”プリウス”,”青”) #河野さんの車のspecです
河野.新しい色(“黄色”) #新しい色を設定します(ここで初めて親の性格から脱出です)

print(遠藤.モデル, 遠藤.色, 遠藤.駆動方式) #遠藤さんの車のspecの表示です
print(河野.モデル, 河野.駆動方式, 河野.色) #河野さんの車のspecです

runすると次のように表示されます。 

#======= クラス作成1.py =======
#リーフ 赤 4駆 #遠藤さんの車のspecです
#プリウス 4駆 黄色 #河野さんの車のspecです#河野さんの車のspecです
#=========================

・オーバーライドしたインスタンスでは、青色が黄色に上書きされています。

———————————————–

 

④ 子クラスから親クラス(super)のメソッド(処理作業)を呼び出す Ⅰ

・子クラスに独自のメンバー変数を追加したり、メンバー変数をオバーライドしたい場合は、
 親クラスのコンストラクタを呼び出したあとに追加すればよい。 次のcode参照下さい。

#クラス継承2.py 11/16/2019

class 動物():#親クラス(スーパークラス)
    def __init__(self, 名前):
        self.名前 = 名前

class イヌ(動物):#子クラス(サブクラス)
    def __init__(self, 名前):
        super().__init__(名前)
        self.名前 = “私の名前は” + 名前 + “です”
    def 吠える(self):
        print (self.名前 + “。 バウワウと吠えます。”)

ポチ = イヌ(“ポチ”)
ポチ. 吠える()

========= runすると次のように表示されます
私の名前はポチです。 バウワウと吠えます。
>>>

———————————————–

⑤ 子クラスから親クラス(super)のメソッド(処理作業)を呼び出す Ⅱ

今までは一つのクラスにすべてのcodeを書いて説明しましたが、それだと実用上のメリットを感じません。
今度は親クラスと子クラスを別々のfileにして、子クラスから親クラスのメソッドを呼び出して使うようにしてみます。

#Super.py 11/18/2019

class animal():
    def __init__(self, name):
        self.name = name
上が親クラス

下が子クラス
#Child.py 11/18/2019

import Super

class dog(Super.animal):
    def __init__(self, name):
        super(dog, self).__init__(name)
        self.name = “Dog: I’m ” + name

    def cry(self):
        print (self.name + “. bow-wow”)

egie = dog(“Egie”)
egie.cry()

同じholderに入っていれば、子クラスをrunすると、次のように表示される。

===
Dog: I’m Egie. bow-wow
>>>


 

⑥ クラス変数を日本語で

codeの変数は普通は半角英文字で書きますが、試しに全角日本文字で書いてみました。

インデント(文字下げ)は半角4文字分です。 全角、半角を混ぜるとまず混乱しますので
お遊び以外はやらない方が宜しいようです。 でも直感的には分かり易くなります。

 

#Super.py 11/18/2019 親クラスです

class 動物():#親クラス(スーパークラス)
    def __init__(self, 名前):
    self.名前 = 名前

#Child.py 11/18/2019  子クラスです。 親と同じholderに入れます。

import Super #親ファイルをimportします

class イヌ(Super.動物):#子クラス(サブクラス)
    def __init__(self, 名前):
        super(イヌ, self).__init__(名前)
        self.名前 = “私の名前は” + 名前 + “です”

    def 吠える(self):
        print (self.名前 + “。 バウワウと吠えます。”)

egie = イヌ(“Egie”)
egie.吠える()

===これがrunさせた結果です
私の名前はEgieです。 バウワウと吠えます。
>>>

 

さて、一通りのクラスの作り方・使い方を書きましたが、まだまだ使える段階に至っておりません。
ただ、AIの記事やらアプリを見ると頻繁に使われておりますので、取敢えずは何をやっているのが多少理解できそうになりました。

ということでクラス編はお仕舞です。 Thanks.

 

 

 

 

 

 

 

Python別館
難解のクラス-2

取敢えず一回目の例題と説明は終えましたが、自分でcodeを書くとエラーが続出。更に最初から例題で練習 …

Python別館
難解のクラスを作る-1 (完)

オブジェクト指向言語には、良く分からないクラスと云うものが有ります。 いまネットやyoutubeでP …

Python別館
全手動で撮影する人の為のアプリ(完)

以前Pythonで「EV計算機を作る」を作ったことがありますが、今回は簡単にスクリプトでEV関係のク …