2013-04-23 17 views
15

Wiem, co robią i widziałem wiele przykładów obu, ale nie znalazłem ani jednego przykładu, w którym musiałbym użyć classmethod zamiast zastępowania go staticmethod.Dlaczego warto używać metody classmethod zamiast staticmethod?

Najczęstszym przykładem classmethod Widziałem to do tworzenia nowej instancji samej klasy, jak to (bardzo uproszczony przykład, nie ma sensu metody atm ale masz pomysł.):

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

To spowoduje zwrócenie nowej instancji Foo podczas wywoływania foo = Foo.create_new(). Teraz dlaczego nie można po prostu użyć tego zamiast:

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

Robi dokładnie to samo, dlaczego kiedykolwiek użyć classmethod nad staticmethod?

+7

@KevinBrydon nie ma * odpowiedzi * na pytanie OP na tej stronie, ale może być w komentarzach. Nie wiem, czy to wystarczający powód, aby to zamknąć. – jamylak

+1

To pytanie NIE jest duplikatem połączonego pytania. Odpowiedzi na połączone pytanie nie dotyczą: DLACZEGO używałbyś metod klasowych zamiast metod statycznych i na odwrót. – spacetyper

Odpowiedz

17

Jest mała różnica w przykładzie, ale załóżmy, że stworzył podklasę Foo i nazywa się metodą create_new na podklasy ...

class Bar(Foo): 
    pass 

obj = Bar.create_new() 

... wtedy to klasa bazowa spowoduje nową Bar obiektu zostać utworzona ...

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

... natomiast ta klasa bazowa spowodowałby nowy Foo obiekt ma zostać utworzony ...

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

... więc wybór zależy od tego, jakie zachowanie chcesz.

+0

Nie myślałem o podklasach, moje złe! Dzięki za szybką odpowiedź :) Przyjmę jak najszybciej. –

5

Tak, te dwie klasy zrobią to samo.

Jednak teraz wyobrazić podtypu tej klasy:

class Bar (Foo): 
    pass 

Teraz wzywającą Bar.create_new robi coś innego. W przypadku metody statycznej otrzymuje się Foo. W przypadku metody klasy otrzymuje się Bar.

Ważną różnicą jest to, że metoda klasy otrzymuje typ przekazany jako parametr.

4

Z metody docs metoda klasy odbiera swoją klasę jako niejawny argument, natomiast metody statyczne nie są świadome klasy, w której się znajdują.

Może to być przydatne w sytuacjach, w których istnieje odziedziczona metoda statyczna, która ma zostać zastąpiona innym zachowaniem w podklasie.

Powiązane problemy