[解決済み] classmethodとdef method(self)はいつ使うべきですか?
質問
今まで使ったことのない Django アプリを統合しているとき、クラス内部で関数を定義する 2 つの異なる方法を見つけました。著者はそれらを区別して意図的に使用しているようです。最初のものは、私自身がよく使うものです。
class Dummy(object):
def some_function(self, *args, **kwargs):
# do something here
# self is the class instance
もうひとつは、いつ、何のために使うのか理解できないので、ほとんど使うことがないものです。
class Dummy(object):
@classmethod
def some_function(cls, *args, **kwargs):
# do something here
# cls refers to what?
は
classmethod
というデコレータがpythonのドキュメントに書かれています。
クラスメソッドは、インスタンスメソッドがインスタンスを受け取るのと同じように、暗黙の第一引数としてクラスを受け取ります。 インスタンスメソッドがインスタンスを受け取るように。
ということで、推測ですが
cls
というのは
Dummy
そのものを指します。
class
インスタンスではない)。私は常にこれを行うことができるので、これが存在する理由を正確に理解していません。
type(self).do_something_with_the_class
これは単にわかりやすくするためなのか、それとも一番大事な、これなしではできない不気味で魅力的なものを見逃してしまったのか?
どのように解決するのですか?
あなたの推測は正しいです - あなたは理解している
どのように
classmethod
が働くのか。
なぜかというと、これらのメソッドはインスタンス上でもクラス上でも呼び出せるからです(どちらの場合も、クラスオブジェクトが第一引数として渡されます)。
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
print cls
#both of these will have exactly the same effect
Dummy.some_function()
Dummy().some_function()
インスタンスでの使用について : インスタンス上でclassmethodを呼び出すには、少なくとも2つの主な使い方があります。
-
self.some_function()
は、そのバージョンを呼び出します。some_function
の実際の型に対してself
の実際の型に対して、その呼び出しがたまたま現れるクラスではなく、(そして、クラスがリネームされても注意を払う必要はありません)、そして -
の場合
some_function
は何らかのプロトコルを実装するために必要ですが、クラスオブジェクトだけで呼び出すと便利です。
との違いは
staticmethod
: インスタンスデータにアクセスしないメソッドを定義する方法として、もう一つ
staticmethod
. これは暗黙の第一引数を全く受け取らないメソッドを作成します。従って、呼び出されたインスタンスやクラスに関する情報は一切渡されません。
In [6]: class Foo(object): some_static = staticmethod(lambda x: x+1)
In [7]: Foo.some_static(1)
Out[7]: 2
In [8]: Foo().some_static(1)
Out[8]: 2
In [9]: class Bar(Foo): some_static = staticmethod(lambda x: x*2)
In [10]: Bar.some_static(1)
Out[10]: 2
In [11]: Bar().some_static(1)
Out[11]: 2
私が見つけた主な使い道は、既存の関数(これは
self
を受け取ることを期待しない) をクラス (またはオブジェクト) のメソッドとして適応させることです。
関連
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonのdictsで'has_key()'と'in'のどちらを使うべきですか?
-
[解決済み] CSS Flexboxで、"justify-items "と "justify-self "プロパティはなぜないのですか?
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] Python 言語を決定するには?
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。