クラス変数とクラス メソッド
クラスは、インスタンスを作らなくても、そのまま使える変数とメソッドを定義できます。こうした変数やメソッドのことを、クラス変数、クラス メソッドと呼びます。
クラス変数やクラス メソッドは、クラス全体で利用する値や処理として書きます。
クラス変数は、class文でインデントしたところに直接書きます。クラス メソッドは、@classmethodを付けてメソッドを書きます。このとき、第1引数はクラス自身を表すclsにします。
インスタンス メソッドから、クラス変数やクラス メソッドを利用するときは、self.~で書きます。
実際にどのようなものか、Pythonのプログラムで見てみましょう。classmethod_1.pyというファイルを作って、プログラムを書いて実行します。
class Chara2:
MIN_AGE = 0 # クラス変数
MAX_AGE = 100 # クラス変数
@classmethod
def check_age(cls, age): # クラス メソッド
if age < cls.MIN_AGE: return False
if age > cls.MAX_AGE: return False
return True
def __init__(self): # コンストラクター
self.age = 0
def set_age(self, age): # インスタンス メソッド
if self.check_age(age): # クラス メソッドを使用
print("OK")
else:
print(f"警告 age: {self.MIN_AGE}-{self.MAX_AGE}") #クラス変数を使用
self.age = age # インスタンス変数を使用
print(Chara2.MIN_AGE) # 「0」と表示
print(Chara2.MAX_AGE) # 「100」と表示
print(Chara2.check_age(-1)) # 「False」と表示
print(Chara2.check_age(16)) # 「True」と表示
print(Chara2.check_age(101)) # 「False」と表示
chara2 = Chara2()
chara2.set_age(20) # 「OK」と表示
chara2.set_age(200) # 「警告 age: 0-100」と表示
継承
多くのプログラミング言語で、クラスは継承をおこなえます。継承とは、元のクラスの機能を引き継いだ派生クラスを作ることです。このとき、元のクラスを親クラス、派生したクラスを子クラスと呼びます。
現実世界の製品でたとえれば、ハンバーガーから派生したチーズバーガーを作るようなことです。
クラスの継承をおこなうと、子クラスからは、親クラスの変数やメソッドが使えます。その上で子クラスでは、新しい変数やメソッドを付け足したり、親クラスが持つメソッドの機能を変えたりできます。
Pythonのクラスで継承をおこなうときは、class文のあとに( )を書き、その中に親クラスを書きます。プログラミング言語によっては、親クラスは1つしか指定できませんが、Pythonでは複数指定できます。複数の親クラスを書くときは、( )の中に,区切りで書きます。
親クラスのメソッドの機能を変更したいときは、オーバーライド(上書き)をおこないます。メソッドのオーバーライドは、同名のメソッドを書けばよいです。
オーバーライドしたメソッドの中で親クラスのメソッドを利用したいときは、super()関数を使います。この使い方はのちほど例の中で示します。
Pythonのクラスの継承が、実際にどのようなものかプログラムで見てみましょう。inheritance_1.pyというファイルを作り、プログラムを書いて実行します。
# 親クラス
class Chara:
# コンストラクター
def __init__(self, name):
self.name = name
# インスタンス メソッド
def get_prof(self):
res = f"{self.name}"
return res
# インスタンス メソッド
def get_name(self):
return self.name
# 子クラス
class Hero(Chara):
# コンストラクター
def __init__(self, name, hp):
# super()で、親クラスのメソッドを使う
super().__init__(name)
self.hp = hp # インスタンス変数を追加
# オーバーライド
def get_prof(self):
# super()で、親クラスのメソッドを使う
res = f"{super().get_prof()} {self.hp}"
return res
# 新しいメソッド
def is_alive(self):
return self.hp > 0
hero = Hero("勇者", 10)
print(hero.get_prof()) # 「勇者 10」と表示
print(hero.is_alive()) # 「True」と表示
super().親クラスのメソッド()と書くことで、親クラスのメソッドを利用できます。super().__init__()ならコンストラクターを利用できます。
上の例のsuper().__init__(name)は、クラス名を使いChara.__init__(self, name)と書くこともできます。
また、super().get_prof()は、クラス名を使いChara.get_prof(self)と書くこともできます。

