class Parent(object):
class_var = 'parent_class_var'
@classmethod
def class_method(cls):
print('cls: {}'.format(cls))
print("class_var: {}".format(cls.class_var))
@staticmethod
def static_method(raw_str):
print(raw_str.strip())
if __name__ == '__main__':
raw_str = 'He has been fired\n'
# cls: <class '__main__.Parent'>
# class_var: parent_class_var
Parent.class_method()
# He has been fired
Parent.static_method(raw_str)
parent = Parent()
# cls: <class '__main__.Parent'>
# class_var: parent_class_var
parent.class_method()
# He has been fired
parent.static_method(raw_str)
共通点
- クラスからもインスタンスからも呼び出せる
違い
- クラスメソッドは
@classmethod
で、スタティックメソッドは@staticmethod
でデコレートする - クラスメソッドは第一引数に暗黙的にクラスを受け取るが、スタティクメソッドは何も受け取らない
どう使い分けるか?
スタティックメソッドはクラスを引数に受け取らないため、
クラスに依存しないロジックをメソッドとして実装することになる。
しかしそもそもクラスに依存しないメソッドならばクラス内のメソッドとしてではなく関数として実装すればいいのではないか?
class Child(Parent):
@staticmethod
def static_method(raw_str):
print(raw_str.strip()+'!')
しかし、このようにクラスを継承して親と子でロジックの内容が変わるときにスタティックメソッドが役に立つ。
クラスメソッドとして実装してもよいが、
クラスに依存しない処理であるということを強調できる。
疑問
C++やJavaではスタティックメソッドしか存在しないため、
Pythonでクラスメソッドもスタティックメソッドも存在するのはやや冗長な感が否めない。