31

私はそれらが何をするかを知っており、両方の例をたくさん見てきましたがclassmethodstaticmethod.

classmethod私が見た最も一般的な例は、次のようにクラス自体の新しいインスタンスを作成することです (非常に単純化された例で、メソッド atm. は使用されていませんが、アイデアはわかります):

class Foo:
    @classmethod
    def create_new(cls):
        return cls()

Fooこれは、 を呼び出したときにの新しいインスタンスを返しますfoo = Foo.create_new()。代わりにこれを使用できないのはなぜですか:

class Foo:
    @staticmethod
    def create_new():
        return Foo()

まったく同じことを行いますが、なぜ aclassmethodよりも a を使用する必要があるのstaticmethodですか?

4

3 に答える 3

29

あなたの例にはほとんど違いはありませんが、サブクラスを作成し、サブクラスFooのメソッドを呼び出したとしcreate_newます...

class Bar(Foo):
    pass

obj = Bar.create_new()

...次に、この基本クラスにより、新しいBarオブジェクトが作成されます...

class Foo:
    @classmethod
    def create_new(cls):
        return cls()

...一方、この基本クラスでは、新しいFooオブジェクトが作成されます...

class Foo:
    @staticmethod
    def create_new():
        return Foo()

...したがって、選択は、必要な動作によって異なります。

于 2013-04-23T14:41:30.800 に答える
7

はい、これらの 2 つのクラスは同じことを行います。

ただし、そのクラスのサブタイプを想像してください。

class Bar (Foo):
    pass

これで、呼び出しBar.create_newは別のことを行います。静的メソッドの場合、Foo. クラスメソッドの場合、Bar.

したがって、重要な違いは、クラス メソッドがパラメーターとして渡された型を取得することです。

于 2013-04-23T14:43:53.733 に答える
4

docsから、クラスメソッドはそのクラスを暗黙の引数として受け取りますが、静的メソッドはそれらが存在するクラスを認識しません。

これは、サブクラスで異なる動作でオーバーライドしたい継承された静的メソッドがある場合に役立ちます。

于 2013-04-23T14:44:26.757 に答える