質問:
@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?