クラスメソッドとスタティックメソッド

クラスメソッド

クラスメソッドはメソッド内で「クラス自身」を参照することができるメソッドです。

メソッドの第1引数にはそのクラス自身をclsという名前で指定します。第2引数以降は通常の引数となります。

クラスメソッドを利用するには組込みのデコレータである@classmethodを利用します。

class Coordinate:
    """ 座標クラス """

    def __init__(self):
        """ 初期化 """
        self.x = 0
        self.y = 0

    def show_coordinate(self):
        """ 座標を表示する """
        print(self.x, self.y)

    @classmethod
    def create_new_cood(cls, x, y):
        """ Coodinateオブジェクトを生成して返す """
        new_cood = cls() # Coodinateオブジェクトを生成
        new_cood.x = x # 座標を設定
        new_cood.y = y # 座標を設定
        return new_cood

cood = Coordinate() # インスタンスを生成する
cood2 = cood.create_new_cood(10, 20)
cood2.show_coordinate()

スタティックメソッド

スタティックメソッドはクラスに属しますが、そのクラスに依存しなメソッドです。

つまり、スタティックメソッドはクラスのメンバにはアクセスすることができません。

また、このことから引数のselfは不要となります。

スタティックメソッドを実行する際は、クラス名.スタティックメソッド名で記述します。

クラスメソッドを利用するには組込みのデコレータである@staticmethodを利用します。

import math

class Coordinate:
    """ 座標クラス """
 
    def __init__(self):
        """ 初期化 """
        self.x = 0 
        self.y = 0 
 
    def show_coordinate(self):
        """ 座標を表示する """
        print(self.x, self.y)

    @staticmethod
    def calc_dist(cood1, cood2):
        """ 座標間の距離を計算します """
        x = cood1.x - cood2.x
        y = cood1.y - cood2.y
        return math.sqrt((math.pow(x, 2) + math.pow(y, 2)))


cood1 = Coordinate() # インスタンスを生成する
cood1.x, cood1.y = 100, 100 

cood2 = Coordinate() # インスタンスを生成する
cood2.x, cood2.y = 200, 200 

dist = Coordinate.calc_dist(cood1, cood2) # スタティックメソッドを実行
print(dist)

例えば上のサンプルでは、座標クラスに座標間の距離を計算するメソッドを実装していますが、オブジェクトの状態に依存する機能ではないため、スタティックメソッドとして実装されています。