Pythonには、主に3つのタイプのメソッドがあります:インスタンスメソッド、クラスメソッド、および静的メソッド。歴史的にPythonはインスタンスメソッド(最初の引数がself)のみをサポートしてきました。その後、オブジェクトに依存せず、クラスそのものにアクセスすることができる追加のメソッドタイプの必要性が生じました。
問題: 時には、オブジェクトのインスタンスの状態に依存しないメソッド(ファクトリメソッドなど)を作成する必要があります。また、クラスのコンテキストを必要としないメソッドを作成する必要がある場合もありますが、論理的にはクラスの構造に含まれています。
解決策: デコレーター @classmethod および @staticmethod を使用します。
コード例:
class Example: def instance_method(self): return f'instance: {self}' @classmethod def class_method(cls): return f'class: {cls}' @staticmethod def static_method(): return 'static'
主な特徴:
静的メソッドはクラスやインスタンスの属性にアクセスできますか?
いいえ、静的メソッドはクラスやインスタンスのリファレンスを取得しません。
class A: x = 10 @staticmethod def f(): # print(self.x) # エラー pass
クラスメソッドはサブクラスでオーバーライドできますか?
はい、サブクラスからclassmethodを呼び出すと、最初の引数は常に実際のクラスであり、親クラスではありません。
class Base: @classmethod def name(cls): return cls.__name__ class Child(Base): pass Child.name() # "Child"
なぜクラスメソッドにselfを使用できないのですか?
クラスメソッドは特定のオブジェクトに関連付けられておらず、クラス全体に関連しているためです。selfはインスタンスを作成しないと利用できません。
ファクトリーメソッドをstaticmethodとして定義し、その中でselfを介してクラスのインスタンスを作成しようとすると、エラーやコードの重複が発生します。
利点:
欠点:
ファクトリーがclassmethodとして宣言され、その中で実際のクラス(cls)を使用してインスタンスを作成します。サブクラスはこのファクトリーを介して正しく作成されます。
利点:
欠点: