@classmethod と def method(self) はいつ使用すればよいですか? 質問する

@classmethod と def method(self) はいつ使用すればよいですか? 質問する

これまで使用したことのない 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?

classmethodPython ドキュメントのデコレータには次のように書かれています:

インスタンス メソッドがインスタンスを受け取るのと同じように、クラス メソッドは暗黙的な最初の引数としてクラスを受け取ります。

つまり、 はそれ自体 (インスタンスではなく )clsを参照していると思います。なぜこれが存在するのか正確にはわかりません。なぜなら、常に次のようにできるからです。Dummyclass

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 つあります。

  1. self.some_function()は、その呼び出しが偶然に出現したクラスではなく、some_function実際の型ののバージョンを呼び出します(クラスの名前が変更されても注意する必要はありません)。そしてself
  2. 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) をクラス (またはオブジェクト) のメソッドとして適応させることです。

おすすめ記事