インスタンスメソッドとクラスメソッドの使い分け
今回は、インスタンスメソッドとクラスメソッドの使い分け方について書いてみます。
インスタンスメソッド
インスタンスごとで挙動を制御したい場合に使用します
- インスタンスを生成しないと呼び出すことができない
- インスタンス名.メソッド名で呼び出すことができる
- 第一引数には
self
を用いる
クラスメソッド
クラス全体で共通の挙動を制御する際に使用します
- インスタンス化しなくてもメソッドを呼び出せる
- クラス名.メソッド名で呼び出すことが可能
- メソッドの一番上に
@classmethod
と付けることで定義する - クラスメソッドの第一引数は
cls
を用いる
学校を例にしたインスタンスメソッドとクラスメソッドの使い分け
学校
class Class:
# 学校全体の入学者数
all_students_count = 0
def __init__(self, teacher_name, grade, group):
self.teachername = teacher_name
self.grade = grade
self.group = group
self.roster=[]
def enter(self, name):
# インスタンスメソッド
self.roster.append(name)
Class.all_students_count +=1
@classmethod
def reset_students_count(cls, reset):
# クラスメソッド
cls.all_students_count = reset
# インスタンスメソッドで2年3組の入学者を記録
cl_23 = Class("山中", 2, 3)
cl_23.enter("平沢")
cl_23.enter("秋山")
cl_23.enter("田井中")
cl_23.enter("琴吹")
cl_23.enter("真鍋")
print("2年3組の入学者名簿" , cl_23.roster)
print(cl_23.all_students_count)
#出力: 2年3組の入学者名簿 ['平沢', '秋山', '田井中', '琴吹', '真鍋'], 5
# インスタンスメソッドで1年1組の入学者を記録
cl_11 = Class("豊田", 1, 1)
cl_11.enter("金子")
cl_11.enter("佐藤")
cl_11.enter("清水")
print("1年1組の入学者名簿" , cl_11.roster)
print(cl_11.all_students_count)
#出力: 1年1組の入学者名簿 ['金子', '佐藤', '清水'], 8
# クラスメソッドで全ての入学者数をリセット
Class.reset_students_count(0)
print(cl_11.all_students_count)
#出力:0