3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonにおけるクラスメソッドの要点

  • インスタンスに紐づかないメソッドのこと
  • @classmethodデコレータを使って定義する
    • デコレータについてはこちら
  • クラス内で便利関数的に利用する
  • 引数にclsを取ってクラスの情報にアクセスできる
    • thisとは違う、thisはインスタンスの情報にアクセスする
  • 呼び出し方は.
  • なおクラスの情報を使わない場合はクラスメソッドとせずにstatixメソッドとすれば良い
  • クラスメソッドに限った話ではないが、定義名に接頭辞に_(アンダースコア)をつけて他で利用されないことを明示する(あくまで明示で、アンダースコアをつけるだけではprivateのような実際のアクセス制限はされないので注意)
  • クラスメソッド内でインスタンスを生成して返すことも可能
    • 俗にいうファクトリーメソッド

クラスメソッド内でインスタンスを生成するとは?

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

    @classmethod
    def create_guest(cls):
        return cls("ゲスト")

# 使用例
guest = User.create_guest()
print(guest.name)  # => ゲスト

cls("ゲスト") によって、User クラスのインスタンスを生成して返している例です。
確かにcreate_userというクラスメソッドによってインスタンスが生成されていますね。

staticメソッドとの使い分け

  • 要点でも記載した内容ですが、クラス内部の情報を使う→クラスメソッド使わない場合はstaticメソッドとすべきです。

以下の様な場合はクラスの情報を使っていないのでstaticメソッドでいいですよね

class MathUtils:
    @staticmethod
    def add(x, y):
        return x + y

# 使用例
print(MathUtils.add(3, 5))  # => 8
# クラスの状態や属性を一切参照しないので、@staticmethod が適切
  • 半単に以下のような場合はクラスの情報を使っているのでクラスメソッドとして定義すべきです。
class Config:
    default_timeout = 30

    @classmethod
    def get_default_timeout(cls):
        return cls.default_timeout

# 使用例
print(Config.get_default_timeout())  # => 30
# cls.default_timeout のようにクラス属性にアクセスしているため、@classmethod が適切
3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?