2013-04-23 7 views
15

Ich weiß, was sie tun, und ich habe viele Beispiele von beiden gesehen, aber ich habe kein einziges Beispiel gefunden, wo ich verwenden müsste, anstatt es durch eine staticmethod zu ersetzen.Warum Klassenmethode anstelle von staticmethod?

Das häufigste Beispiel für classmethod ich gesehen habe, ist für sich eine neue Instanz der Klasse erstellen, wie diese (sehr vereinfachtes Beispiel, gibt es keine Verwendung des Verfahrens atm aber Sie bekommen die Idee.):

Dies würde eine neue Instanz von Foo Rückkehr
class Foo: 
    @classmethod 
    def create_new(cls): 
     return cls() 

wenn foo = Foo.create_new() Aufruf. Nun, warum nicht ich dies nur statt:

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

Es ist genau die gleiche, warum soll ich jemals ein classmethod über ein staticmethod verwenden?

+7

@KevinBrydon gibt es keine * Antwort * auf OPs Frage auf dieser Seite, aber es könnte in den Kommentaren da sein. Ich weiß nicht, ob das ausreicht, um dies zu schließen, obwohl – jamylak

+1

Diese Frage ist kein Duplikat der verknüpften Frage. Die Antworten auf die verknüpfte Frage behandeln nicht, WARUM Sie Klassenmethoden gegenüber statischen Methoden verwenden oder umgekehrt. – spacetyper

Antwort

17

Es gibt kaum einen Unterschied in Ihrem Beispiel, aber nehmen Sie auf der Unterklasse eine Unterklasse von Foo und riefen die create_new Methode erstellt ...

class Bar(Foo): 
    pass 

obj = Bar.create_new() 

... dann diese Basisklasse ein neues Bar Objekt verursachen würde erstellt ...

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

... während diese Basisklasse würde bewirken, dass eine neue Foo zu lösender Aufgabe geschaffen werden ...

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

... so würde die Wahl abhängen, welches Verhalten Sie wünschen.

+0

Ich habe gar nicht an Unterklassen gedacht, mein Schlechter! Danke für die schnelle Antwort :) Ich werde so schnell wie möglich akzeptieren. –

5

Ja, diese beiden Klassen würden das gleiche tun.

jedoch vorstellen, jetzt ein Subtyp dieser Klasse:

class Bar (Foo): 
    pass 

Nun ruft Bar.create_new etwas anderes tut. Für die statische Methode erhalten Sie eine Foo. Für die Klassenmethode erhalten Sie eine Bar.

Der wichtige Unterschied ist also, dass eine Klassenmethode den Typ als Parameter übergeben bekommt.

4

Aus der docs erhält eine Klassenmethode ihre Klasse als implizites Argument, während statische Methoden die Klasse nicht kennen, in der sie sich befinden.

Dies kann in Situationen nützlich sein, in denen Sie eine geerbte statische Methode haben, die Sie mit einem anderen Verhalten in der Unterklasse überschreiben möchten.