@classmethod【クラスメソッド】
@staticmethod【静的メソッド】

@classmethod【クラスメソッド】3.9 / 3.10
@staticmethod【静的メソッド】3.10

メモ

  • クラスメソッド静的メソッドデコレータ  (def【関数定義】も参照)
    デコレータ引数クラスから呼び出しインスタンスから呼び出し用途
    @classmethod
    【クラスメソッド】
    cls(クラス) + 任意クラス毎の情報参照 (継承時に有用)
    @staticmethod
    【静的メソッド】
    任意継承時も固定情報参照
    (C系言語の静的メソッド相当)
    なし (通常メソッド)self(インスタンス) + 任意インスタンス毎の情報参照
  • 下記メソッド属性を継承 3.10
    • __module__
    • __name__
    • __qualname__3.3
    • __doc__
    • __annotations__
    • __wrapped__ 3.10
  • @classmethod【クラスメソッド】はproperty()等のデスクリプタのラップが可能 3.9

外部リンク

構文

@classmethod
【メソッド定義】
@staticmethod
【メソッド定義】

class Parent():
    msg = "[Parent]"

    def __init__(self, name):
        self.name = name

    @classmethod
    def class_method(cls):
        print("class_method() " + cls.msg)

    @staticmethod
    def static_method():
        print("static_method() " + Parent.msg)

    def method(self):
        print("method() " + self.name)


class Child(Parent):
    msg = "[Child]"


obj1 = Parent("TARO")

Parent.class_method()   # 出力:class_method() [Parent]
Parent.static_method()  # 出力:static_method() [Parent]
#Parent.method()        # TypeError 例外

obj1.class_method()   # 出力:class_method() [Parent]
obj1.static_method()  # 出力:static_method() [Parent]
obj1.method()         # 出力:method() TARO

obj2 = Child("ICHIRO")

Child.class_method()   # 出力:class_method() [Child]
Child.static_method()  # 出力:static_method() [Parent]
#Child.method()        # TypeError 例外

obj2.class_method()   # 出力:class_method() [Child]
obj2.static_method()  # 出力:static_method() [Parent]
obj2.method()         # 出力:method() ICHIRO