新たな気づき(Chapter 12-1)
花粉症がひどくて頭が全然働いてないところに、自分的に苦手なクラスをやっているので、全然前に進んでいる感じがしません。
- クラスはオブジェクトの設計書であり、クラスで作ったオブジェクトをインスタンスと呼ぶ。
- 初期化メソッドとは、インスタンスが作られたときに自動的に実行されるもの。名前は慣例的に__init__とされ、第1引数はself。
class クラス名: クラス変数の定義 @classmethod def クラスメソッド名(cls, 引数1, 引数2, ...): クラスメソッドの定義 def __init__(self, 引数1, 引数2, 引数3="デフォルト値"...): 初期化の処理 def メソッド名(self, 引数1, 引数2, 引数3="デフォルト値"...): インスタンスメソッドの定義
- 上記の初期化処理の位置に、「self.変数名 = 初期値」を置く。引数でデフォルト値を指定しそれを代入することも可能。
- インスタンス名=クラス()でインスタンスを作成
- インスタンス.変数でインスタンスの変数に何が入っているかにアクセスできる。
- インスタンス.変数 = 値、でインスタンス変数に値を代入できる。
- 「インスタンスが実行できること」を上記のコードの後段部分でインスタンスメソッドとして定義する。
- インスタンスメソッドの定義も同じくselfを第1引数として置く。
- インスタンス.メソッド()でインスタンスメソッドを実行できる。
- クラス自身がクラス変数とクラスメソッドを持つことも可能。これらをクラスメンバーと呼ぶ。
- クラス自身が持つことでクラス内に複数のインスタンスを定義するときにデフォルトとして共有でき、クラスメソッドもインスタンスから実行できる。
- クラス.変数名でクラス変数を参照できる。
- クラスメソッドはdef文で定義するのはインスタンスメソッドと同じだが、defの前の行に@classmethodとデコレータを置く必要がある他、第1引数がselfではなくclsである点が違う。
class Car: #クラス変数 maker="RENAULT" #メーカー count=0 #台数 @classmethod def countup(cls): cls.count += 1 print(f"出荷台数は{cls.count}台です。") #初期化メソッド def __init__(self, color="white"): Car.countup() # クラスメソッドを呼び出し台数をカウントアップする。 # 初期化メソッドが利用され、インスタンス数が増えるごとに車の台数が増える。 self.mynumber = Car.count #出荷台数を自分番号として保存する。生産番号のようなもの。 self.color = color # 車の色の初期値を引数から受け取る self.mileage = 0 # 走行距離の初期値をセロにする #インスタンスメソッド def drive(self, km): self.mileage += km msg = f"{km}kmドライブしました。総走行距離は{self.mileage}kmです。" print(msg) #クラス変数を参照 print(Car.maker) #RENAULT print(Car.count) #最初だから0 car1 = Car() # 白い車のインスタンスを作成。デフォルト car2 = Car("red") # 赤い車のインスタンスを作成。colorに代入される car3 = Car("black") # 黒い車のインスタンスを作成。 print(Car.count) # "インスタンス.変数名"でインスタンスの変数名にアクセスできる print(car1.mileage) # 0 print(car2.color) # red #インスタンス変数の値を更新する print(car1.color) # white car1.color = "blue" print(car1.color) # blue # "インスタンス.メソッド()"でインスタンスメソッドを実行 car1.drive(15) # 0+15=15 car1.drive(20) # 15+20=35 car2.drive(50) # 0+50=50 car2.mileage = 100 #100で再設定 car2.drive(10) #100+10=110
- クラスを定義した後でも変数やメソッドは追加可能。クラス.クラス変数A=値aを入力し、そのクラス変数Aがクラス内に定義されていない場合は、クラス変数Aがクラスに追加される。これはメソッドでも同様。クラス.クラスメソッドA=メソッドaが入力され、クラスメソッドAがクラス内に定義されていない場合は、クラスメソッドがクラスに追加される。インスタンスにも同様の事が可能。
- 追加したメンバーは「メンバー = None」もしくは「del メンバー」で削除可能。