🐙

Python100本ノック#9 クラスメソッド(classmethod)とスタティックメソッド(staticmethod)

2023/11/30に公開

クラス属性(Class Attributes)

属性はインスタンス属性とクラス属性の2種類が存在する。
クラス属性はクラス内で定義された属性のことであり、同じクラスの全インスタンスに共用される。

class Person(object):
    # クラス属性count
    count = 0

    # 初期化
    def __init__(self, name):
        self.name = name
        # インスタンス数をカウントするための処理
        Person.count += 1

# 1、インスタンス化
p1 = Person('Tom')
p2 = Person('Harry')
p3 = Person('Jennifer')
# 2、クラス属性を確認する。
print(f'インスタンスの合計数は{Person.count}')

output

インスタンスの合計数は3

クラスメソッド(classmethod)

インスタンス化しなくても呼び出せるメソッドのことである。その特徴から主にクラス属性とその他のクラスを操作する際に利用される。
メソッド前に@classmethodデコレータを利用して修飾する。
クラス名.クラスメソッド名()で呼び出すことができる。
クラスメソッドの第一引数はclsと表し、clsはクラス(class)を意味する。インスタンスを生成しなくても用いることができ、インスタンスを意味するselfを引数に使う必要はない。

具体例

class Tool(object):
    count = 0

    def __init__(self, name):
        self.name = name
        Tool.count += 1

    # クラスメソッドでカプセル化
    @classmethod
    def get_count(cls):
        print(f'インスタンス化したツールの数は{cls.count}')

t1 = Tool('ハンマー')
t2 = Tool('ドリル')
t3 = Tool('ニッパー')

Tool.get_count()

output

インスタンス化したツールの数は3

スタティックメソッド(staticmethod)

インスタンス変数やクラス変数にアクセスできない、独立されているメソッドである。
クラスメソッドと違ってデフォルトの第一引数は存在しない。
メソッド前に@staticmethodデコレータを利用して修飾する。

用途についてはっきりわかっていないね。今後の勉強で実際に使うことがあったら理解を深めようとした。

具体例

class Test(object):
    @classmethod
    def clametho(*args):
        return args

    @staticmethod
    def stametho(*args):
        return args

def test_method(*args):
    return args

print(Test.clametho())
print(Test.clametho('value'))

print(Test.stametho())
print(Test.stametho('value'))

print(test_method())
print(test_method('value'))

output

staticmethod は通常のメソッドは同じ動きになる。OOPでは特定のクラスにしかない特徴を定義するために利用するものかなと思う。

(<class '__main__.Test'>,)
(<class '__main__.Test'>, 'value')
()  
('value',)
()
('value',)

Discussion