[解決済み] staticmethodとclassmethodの違いについて
質問
で装飾された関数の違いは何ですか?
@staticmethod
で装飾されたものと
@classmethod
?
解決方法は?
ちょっとだけ、サンプルコードが役に立つかもしれません。の呼び出しシグネチャの違いに注目してください。
foo
,
class_foo
と
static_foo
:
class A(object):
def foo(self, x):
print(f"executing foo({self}, {x})")
@classmethod
def class_foo(cls, x):
print(f"executing class_foo({cls}, {x})")
@staticmethod
def static_foo(x):
print(f"executing static_foo({x})")
a = A()
以下は、オブジェクトのインスタンスがメソッドを呼び出す通常の方法です。オブジェクトのインスタンスが
a
が第一引数として暗黙のうちに渡される。
a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>, 1)
クラスメソッドで
の代わりに、オブジェクトのインスタンスのクラスが暗黙のうちに第一引数として渡されます。
self
.
a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
を呼び出すこともできます。
class_foo
を使用しています。実際、何かを定義する場合
クラスメソッドを使用するのは、おそらくクラスのインスタンスからではなく クラスから呼び出すことを意図しているからでしょう。
A.foo(1)
はTypeErrorを発生させますが
A.class_foo(1)
は正常に動作します。
A.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)
クラスメソッドの使い方の1つに 継承可能な代替コンストラクタ .
staticmethodsを使用した場合
を使用すると、どちらも
self
(オブジェクトのインスタンス) と
cls
(クラス)は暗黙のうちに第一引数として渡されます。インスタンスやクラスから呼び出すことができることを除けば、これらは普通の関数と同じようにふるまうことができます。
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
Staticmethods は、クラスと何らかの論理的な関係を持つ関数を、クラスにまとめるために使用されます。
foo
は単なる関数ですが
a.foo
は、単に関数を取得するだけではありません。
オブジェクトのインスタンスと一緒に関数の "部分適用バージョンも取得します。
a
を関数の第一引数としてバインドします。
foo
は2つの引数を期待しますが
a.foo
は1つの引数だけを想定しています。
a
にバインドされています。
foo
. これが、以下のquot;bound"という用語の意味するところです。
print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
と
a.class_foo
,
a
にはバインドされません。
class_foo
ではなく、クラス
A
にバインドされています。
class_foo
.
print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
ここでは、メソッドであるにもかかわらずstaticmethodで。
a.static_foo
を返すだけです。
は、引数が束縛されていない、良い'オール'関数です。
static_foo
は1つの引数を期待し
a.static_foo
も1つの引数を期待します。
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
そしてもちろん、同じように
static_foo
というクラスで
A
の代わりに
print(A.static_foo)
# <function static_foo at 0xb7d479cc>
関連
-
Python Decorator 練習問題
-
Python百行で韓服サークルの画像クロールを実現する
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
Pythonコンテナのための組み込み汎用関数操作
-
python string splicing.join()とsplitting.split()の説明
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み] データ型が理解できない
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] 初心者のための@classmethodと@staticmethodの意味?[重複あり]