LoginSignup
1
4

More than 3 years have passed since last update.

インスタンスメソッドとクラスメソッドの使い分け

Posted at

インスタンスメソッドとクラスメソッドの使い分け

今回は、インスタンスメソッドとクラスメソッドの使い分け方について書いてみます。

インスタンスメソッド

インスタンスごとで挙動を制御したい場合に使用します

  • インスタンスを生成しないと呼び出すことができない
  • インスタンス名.メソッド名で呼び出すことができる
  • 第一引数には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
1
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4