Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.
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でクラスメソッドもスタティックメソッドも存在するのはやや冗長な感が否めない。

ysk24ok
今後Qiitaに記事を更新することはありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした