質問:
@staticmethodが付いてる関数と、@classmethodが付いてる関数の違いって何?
回答1:
たぶんコード例で見たほうがいいと思う:foo、class_fooと static_fooのコールのsignature(訳注:メソッド名、パラメータ、戻り値の型をあわせたもの)の違いに注意:
|
以下は、オブジェクトインスタンスがメソッドを呼び出す一般的な方法。オブジェクトインスタンスaは最初の引数として暗黙的に渡される。
|
classmethodsでは、オブジェクトインスタンスのクラスは、selfじゃなく最初の引数として暗黙的に渡される。
|
クラスを使って class_fooを呼び出すこともできるよ。実際、何かをクラスメソッドとが定義した場合、たぶんそれはクラスインスタンスからじゃなくクラスから呼び出されると仮定して定義しているはずなので。A.foo(1)はTypeErrorだけど、 A.class_foo(1)はうまくいくよ:
|
クラスメソッドとしてよく使われるのは、継承可能な代替コンストラクタを作ること。
staticmethodsでは、 self(オブジェクトインスタンス)もcls(クラス)も暗黙のうちに第1引数として渡されない。インスタンスやクラスから呼び出すことができる点を除いて、通常の関数のように動作するよ。
|
staticmethodsはあるクラスとそのクラスへの論理接続を持つ関数をグループ化するために使用される。
fooは単なる関数だけど、a.fooを呼び出すと、関数自身は得ることができなくて、最初の引数としてバインドされたオブジェクトインスタンス aへ”部分的に適用された”関数が与えられる。fooは2つの引数があることを期待してるけど、a.fooは1つの引数しか期待していない。
ここでaはfooにバインドされてる。これは、以下のように「束縛」(bound)が意味してるものでもある:
|
a.class_fooでは、aは class_fooに束縛されず、むしろクラスAはclass_fooに束縛されてる。
|
staticメソッドでは、例えそれがメソッドであっても a.static_fooは何も引数がバインドされていない「古き良き」関数を返してくれる。static_fooは1つ引数があるのをを期待してて、a.static_fooも1つの引数があるのを期待してる。
|
そしてもちろん、代わりにクラスAでstatic_fooを呼び出すと同じことが起こる。
|
Source: What is the difference between @staticmethod and @classmethod in Python?