【Python】クラスメソッドの書き方と使い方の基本

作成日: 更新日:

開発環境

  • Python version: python 3.10.11

Pythonのクラスメソッドとは

Pythonのクラスメソッドとは、クラスに属するメソッドです。 各インスタンスに紐づかせるインスタンスメソッドに対し、クラスメソッドはクラス自体に紐づかせるためのメソッドです。 インスタンスメソッドは、インスタンスを介してアクセスすることができましたが、クラスメソッドはクラスを介してアクセスすることができます。 公式リファレンス:https://docs.python.org/ja/3/tutorial/classes.html

Pythonのクラスメソッドの使いどころ

クラスメソッドは、特定のクラス全体に関連する操作を実行する場合に便利です。 例えば、クラスメソッド内で新しいインスタンスを生成して返すファクトリメソッドとして使用することにより、オブジェクトの生成と初期化の抽象化を容易にすることができます。 また、クラス変数の操作やオブジェクトの初期化を代替することができたり、、同じ基底クラスから派生する複数のクラスを生成する際に有用です。

Pythonのクラスメソッドの書き方

Pythonのクラスメソッドの書き方ご紹介します。

1# クラスの定義
2class クラス名:
3    @classmethod
4    def クラスメソッド名(cls, 引数1, 引数2, ...):
5        # 処理の内容
6
7# クラスメソッドの呼び出し
8クラス名.クラスメソッド名()

デコレータの@classmethod

@classmethodは、Pythonでメソッドがクラスメソッドであることを示すデコレータです。 デコレータは関数やメソッドを修飾するための構文で、関数やメソッドの上に@デコレータ名の形で記述します。 クラスメソッドはクラス全体に関連する操作を行うためのメソッドであり、通常、クラス自体に対する処理を行う際に使用されます。

第一引数のcls

クラスメソッドは第一引数としてクラス自体を表すためにclsを使用します。 通常のメソッドがインスタンスにアクセスするためにselfを使用するのと同様に、クラスメソッドはクラスにアクセスするためにclsを使用します。 clsは単なる慣習であり、Pythonの言語仕様ではなく他の名前を使用することも可能ですが、クラスメソッドではclsを使ってクラスを表現する方が明示的で一般的です。

Pythonのクラスメソッドの使い方

Pythonのクラスメソッドのよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。

Pythonのクラスメソッドをクラスオブジェクトから実行するパターン

Pythonのクラスメソッドをクラスオブジェクトから実行するパターンです。

1# クラスの定義
2class CalcClass:
3    # クラス変数として円周率を定義
4    circle_ratio = 3.14
5
6    # クラスメソッドとして面積計算を行う
7    @classmethod
8    def calc_area_of_a_circle(cls, radius):
9        return radius * radius * cls.circle_ratio
10
11# クラスメソッドの呼び出し
12result = CalcClass.calc_area_of_a_circle(5)
13
14print(f"円の面積は{result}cmです。")

上記はCalcClassという名前のクラスを定義しています。 @classmethodデコレータが使われており、これによってcalc_area_of_a_circleメソッドがクラスメソッドとして定義されています。 また、メソッド内のclsパラメータはクラス自体を指します。 サンプルコードではクラスメソッドcalc_area_of_a_circleを呼び出し、円の面積を計算した結果を標準出力に出力しています。 クラスメソッドはクラスに属し、インスタンス化されたオブジェクトではなくクラス自体に関連付けられています。

Pythonのクラスメソッドをファクトリーメソッドとして実行するパターン

Pythonのクラスメソッドをファクトリーメソッドとして実行するパターンです。

1# クラスの定義
2class Circle:
3    # クラス変数として円周率を定義
4    circle_ratio = 3.14
5
6    # コンストラクタを定義
7    def __init__(self, radius):
8        self.radius = radius
9
10    # インスタンスメソッドで面積を計算
11    def calculate_area(self):
12        return self.radius * self.radius * self.circle_ratio
13
14    @classmethod
15    # クラスメソッドで新しいインスタンスを生成して返却する(ファクトリーメソッド)
16    def create_circle(cls, radius):
17        return cls(radius)
18
19# ファクトリーメソッドを使用してインスタンスを生成
20circle_instance = Circle.create_circle(5)
21
22# インスタンスメソッドを使用して面積を計算
23result = circle_instance.calculate_area()
24
25print(f"円の面積は{result}cmです。")

まず、create_circleメソッドを使用して、半径が5の新しい円のインスタンスを生成しています。 そして、生成した円のインスタンスに対して、calculate_areaメソッドを呼び出して面積を計算し、結果をresult変数に格納し、計算された円の面積を最後に表示しています。

おわりに

Pythonのクラスメソッドの使い方を解説してきました。 通常はインスタンスメソッドを使用することが多いかとおもいますが、インスタンスメソッドとの違いがわかってくれば、クラスメソッドとインスタンスメソッドの使い分けもしやすくなります。 また、クラスメソッドを使いこなすことができれば、ファクトリーメソッドなど応用的な使い方もできますので、最初は難しいかもしれませんが、クラスメソッドを使いこなしていきましょう。

【Python】クラスメソッドの書き方と使い方の基本 | いっしー@Webエンジニア