目次
開発環境
- Python version: python 3.10.11
Pythonのクラスメソッドとは
Pythonのクラスメソッドとは、クラスに属するメソッドです。
各インスタンスに紐づかせるインスタンスメソッドに対し、クラスメソッドはクラス自体に紐づかせるためのメソッドです。
インスタンスメソッドは、インスタンスを介してアクセスすることができましたが、クラスメソッドはクラスを介してアクセスすることができます。
公式リファレンス:https://docs.python.org/ja/3/tutorial/classes.html
Pythonのクラスメソッドの使いどころ
クラスメソッドは、特定のクラス全体に関連する操作を実行する場合に便利です。
例えば、クラスメソッド内で新しいインスタンスを生成して返すファクトリメソッドとして使用することにより、オブジェクトの生成と初期化の抽象化を容易にすることができます。
また、クラス変数の操作やオブジェクトの初期化を代替することができたり、、同じ基底クラスから派生する複数のクラスを生成する際に有用です。
Pythonのクラスメソッドの書き方
Pythonのクラスメソッドの書き方ご紹介します。
1 2 3 4 5 6 7 8 | # クラスの定義 class クラス名: @classmethod def クラスメソッド名(cls, 引数1, 引数2, ...): # 処理の内容 # クラスメソッドの呼び出し クラス名.クラスメソッド名() |
デコレータの@classmethod
@classmethod
は、Pythonでメソッドがクラスメソッドであることを示すデコレータです。
デコレータは関数やメソッドを修飾するための構文で、関数やメソッドの上に@デコレータ名
の形で記述します。
クラスメソッドはクラス全体に関連する操作を行うためのメソッドであり、通常、クラス自体に対する処理を行う際に使用されます。
第一引数のcls
クラスメソッドは第一引数としてクラス自体を表すためにcls
を使用します。
通常のメソッドがインスタンスにアクセスするためにself
を使用するのと同様に、クラスメソッドはクラスにアクセスするためにcls
を使用します。
cls
は単なる慣習であり、Pythonの言語仕様ではなく他の名前を使用することも可能ですが、クラスメソッドではcls
を使ってクラスを表現する方が明示的で一般的です。
Pythonのクラスメソッドの使い方
Pythonのクラスメソッドのよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。
Pythonのクラスメソッドをクラスオブジェクトから実行するパターン
Pythonのクラスメソッドをクラスオブジェクトから実行するパターンです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # クラスの定義 class CalcClass: # クラス変数として円周率を定義 circle_ratio = 3.14 # クラスメソッドとして面積計算を行う @classmethod def calc_area_of_a_circle(cls, radius): return radius * radius * cls.circle_ratio # クラスメソッドの呼び出し result = CalcClass.calc_area_of_a_circle(5) print(f"円の面積は{result}cmです。") |
上記はCalcClassという名前のクラスを定義しています。
@classmethod
デコレータが使われており、これによってcalc_area_of_a_circle
メソッドがクラスメソッドとして定義されています。
また、メソッド内のcls
パラメータはクラス自体を指します。
サンプルコードではクラスメソッドcalc_area_of_a_circle
を呼び出し、円の面積を計算した結果を標準出力に出力しています。
クラスメソッドはクラスに属し、インスタンス化されたオブジェクトではなくクラス自体に関連付けられています。
Pythonのクラスメソッドをファクトリーメソッドとして実行するパターン
Pythonのクラスメソッドをファクトリーメソッドとして実行するパターンです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # クラスの定義 class Circle: # クラス変数として円周率を定義 circle_ratio = 3.14 # コンストラクタを定義 def __init__(self, radius): self.radius = radius # インスタンスメソッドで面積を計算 def calculate_area(self): return self.radius * self.radius * self.circle_ratio @classmethod # クラスメソッドで新しいインスタンスを生成して返却する(ファクトリーメソッド) def create_circle(cls, radius): return cls(radius) # ファクトリーメソッドを使用してインスタンスを生成 circle_instance = Circle.create_circle(5) # インスタンスメソッドを使用して面積を計算 result = circle_instance.calculate_area() print(f"円の面積は{result}cmです。") |
まず、create_circle
メソッドを使用して、半径が5の新しい円のインスタンスを生成しています。
そして、生成した円のインスタンスに対して、calculate_area
メソッドを呼び出して面積を計算し、結果をresult
変数に格納し、計算された円の面積を最後に表示しています。
おわりに
Pythonのクラスメソッドの使い方を解説してきました。
通常はインスタンスメソッドを使用することが多いかとおもいますが、インスタンスメソッドとの違いがわかってくれば、クラスメソッドとインスタンスメソッドの使い分けもしやすくなります。
また、クラスメソッドを使いこなすことができれば、ファクトリーメソッドなど応用的な使い方もできますので、最初は難しいかもしれませんが、クラスメソッドを使いこなしていきましょう。