Python classmethod() 関数
classmethod()Python においてメソッドをクラスメソッドに変換するための組み込み関数です。
クラスメソッドは、インスタンスではなくクラスに属するメソッドであり、最初のパラメータはクラス自体です(通常 cls と命名されます)。クラスメソッドはクラスの属性にアクセスできますが、インスタンスの属性にはアクセスできません。
用語解説: classmethod 是 class method(类方法)的缩写。
基本構文とパラメータ
構文形式
classmethod(function)
パラメータの説明
- パラメータ function:
- 型: 関数オブジェクト
- 説明: クラスメソッドに変換する関数。
関数の説明
- 戻り値: クラスメソッドオブジェクトを返します。
- 特徴: 最初のパラメータはクラス自体(cls)であり、インスタンス(self)ではありません。
例
例1:基本的な使い方
例
class MyClass:
class_attr = 0
@classmethod
def increment(cls):
cls.class_attr += 1
return cls.class_attr
@classmethod
def get_count(cls):
return cls.class_attr
# クラスを通じて呼び出します(インスタンスを作成する必要はありません)
print(MyClass.increment()) # 出力: 1
print(MyClass.increment()) # 出力: 2
print(MyClass.get_count()) # 出力: 2
# インスタンス経由でも呼び出せます(ただし一般的ではありません)
obj = MyClass()
print(obj.increment()) # 出力: 3
class_attr = 0
@classmethod
def increment(cls):
cls.class_attr += 1
return cls.class_attr
@classmethod
def get_count(cls):
return cls.class_attr
# クラスを通じて呼び出します(インスタンスを作成する必要はありません)
print(MyClass.increment()) # 出力: 1
print(MyClass.increment()) # 出力: 2
print(MyClass.get_count()) # 出力: 2
# インスタンス経由でも呼び出せます(ただし一般的ではありません)
obj = MyClass()
print(obj.increment()) # 出力: 3
実行結果の予想:
1 2 2 3
コードの解説:
- クラスメソッドは @classmethod デコレータで定義されます。
- 最初のパラメータは cls で、クラス自体を表します。
例2:ファクトリメソッド
例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_dict(cls, data):
"""辞書からオブジェクトを作成"""
return cls(data['name'], data['age'])
@classmethod
def from_string(cls, s):
"""文字列からオブジェクトを作成(形式:name-age)"""
name, age = s.split('-')
return cls(name, int(age))
def __str__(self):
return f"{self.name}, {self.age}岁"
# クラスメソッドを使用したファクトリパターン
p1 = Person.from_dict({'name': 'Tom', 'age': 20})
p2 = Person.from_string("Jerry-25")
print(p1) # 出力: Tom, 20岁
print(p2) # 出力: Jerry, 25岁
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_dict(cls, data):
"""辞書からオブジェクトを作成"""
return cls(data['name'], data['age'])
@classmethod
def from_string(cls, s):
"""文字列からオブジェクトを作成(形式:name-age)"""
name, age = s.split('-')
return cls(name, int(age))
def __str__(self):
return f"{self.name}, {self.age}岁"
# クラスメソッドを使用したファクトリパターン
p1 = Person.from_dict({'name': 'Tom', 'age': 20})
p2 = Person.from_string("Jerry-25")
print(p1) # 出力: Tom, 20岁
print(p2) # 出力: Jerry, 25岁
実行結果の予想:
Tom, 20岁 Jerry, 25岁
クラスメソッドは、異なるデータソースからオブジェクトを作成するファクトリメソッドを実装するためによく使用されます。
その他の拡張
Python3 組み込み関数