64
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Python] クラスメソッド・スタティックメソッドの違い

Last updated at Posted at 2016-01-17
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でクラスメソッドもスタティックメソッドも存在するのはやや冗長な感が否めない。

64
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?