2013-04-23 2 views
15

私は彼らが何をしているのか知っていますし、両方の例もたくさん見ましたが、staticmethodに置き換える代わりにclassmethodを使用しなければならない例が1つ見つかりませんでした。なぜstaticmethodではなくclassmethodを使用するのですか?

私が見てきたclassmethodの最も一般的な例は、新しいインスタンスクラス自体のを作成するためのであるが、このように(非常に単純化した例、気圧方法のない使用ありませんが、あなたのアイデアを得る。):

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

foo = Foo.create_new()を呼び出すと、Fooの新しいインスタンスが返されます。 今、なぜ私はだけではなく、これを使用することはできません。

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

それはまったく同じ、なぜ私が今までstaticmethodclassmethodを使うべきでしょうか?

+7

@KevinBrydonこのページにはOPの質問に対する*回答*はありませんが、コメントにそこにあるかもしれません。私はそれがこれを閉じるための十分な根拠かどうかわからない – jamylak

+1

この質問は、リンクされた質問の複製ではありません。リンクされた質問への回答は、静的メソッドよりもクラスメソッドを使用する理由、またはその逆を扱うものではありません。 – spacetyper

答えて

17

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

class Bar(Foo): 
    pass 

obj = Bar.create_new() 

...その後、この基底クラスは、新しいBarオブジェクトを引き起こしますこの基底クラスは、新しいFooオブジェクトが作成される原因となるのに対し、

012 ... ... ...

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

を作成します

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

...どのような動作を望むかによって選択肢が異なります。

+0

サブクラスはまったく考えられませんでした。迅速な答えをありがとう:)私は早く受け入れるよ。 –

5

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

class Bar (Foo): 
    pass 

今すぐBar.create_newは違う何かを呼び出す:

しかし、今、そのクラスのサブタイプを想像してみてください。静的メソッドの場合は、Fooが返されます。クラスメソッドの場合、Barが得られます。

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

4

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

これは、継承された静的メソッドをサブクラスの異なる動作でオーバーライドする場合に便利です。