これまで使用したことのない Django アプリを統合しているときに、クラス内で関数を定義する 2 つの異なる方法を見つけました。作者は、それらを区別して意図的に使用しているようです。最初の方法は、私自身がよく使用する方法です。
class Dummy(object):
def some_function(self, *args, **kwargs):
# do something here
# self is the class instance
もう 1 つは、いつ何に使うのか理解していないため、ほとんど使用しないものです。
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
これは単にわかりやすくするためでしょうか、それとも最も重要な部分、つまり、これなしでは実現できない不気味で魅力的なことを見逃してしまったのでしょうか?
ベストアンサー1
あなたの推測は正しいです - あなたは理解していますどうやって 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()
これらのインスタンスの使用について: インスタンス上でクラスメソッドを呼び出す主な用途は少なくとも 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
) をクラス (またはオブジェクト) のメソッドとして適応させることです。