😃
【Python】@classmethodについて
@classmethod
はPythonのデコレータの一つで、インスタンスメソッドではなくクラスメソッドを定義するために使用されます。
通常のインスタンスメソッドは、クラスのインスタンス(オブジェクト)に対して呼び出され、第一引数として自動的にそのインスタンス(慣習的にself
と名付けられる)を受け取ります。一方、クラスメソッドはクラス自体に対して呼び出され、第一引数としてクラス自体(慣習的にcls
と名付けられる)を受け取ります。
例えば:
class MyClass:
count = 0
def __init__(self, name):
self.name = name
MyClass.count += 1
def instance_method(self):
# インスタンスメソッド - selfを通じてインスタンスの属性にアクセス
return f"インスタンスメソッドが呼ばれました: {self.name}"
@classmethod
def class_method(cls):
# クラスメソッド - clsを通じてクラスの属性にアクセス
return f"クラスメソッドが呼ばれました。現在のインスタンス数: {cls.count}"
クラスメソッドの主な用途:
- クラス変数へのアクセスと操作
- 代替コンストラクタの実装(異なる方法でインスタンスを生成する場合)
- ファクトリーメソッドの実装
例えば、代替コンストラクタとしての使用例:
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
@classmethod
def from_string(cls, date_string):
# "YYYY-MM-DD"形式の文字列からインスタンスを作成
year, month, day = map(int, date_string.split('-'))
return cls(year, month, day)
@classmethod
def today(cls):
# 現在の日付からインスタンスを作成
import datetime
d = datetime.datetime.now()
return cls(d.year, d.month, d.day)
この例では、Date
クラスのインスタンスを作成する方法が複数あります:
- 通常のコンストラクタ:
d = Date(2023, 3, 14)
- 文字列から:
d = Date.from_string("2023-03-14")
- 今日の日付から:
d = Date.today()
Discussion