2012-06-06 18 views
8

Powiel możliwe:
What is the difference between @staticmethod and @classmethod in Python?Python Metody statyczne, dlaczego?

Mam kilka pytań dotyczących staticmethods w klasach. Zacznę od podania przykładu.

Przykład pierwszy:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(): 
     return "Hello %s, your age is %s" % (self.first + self.last, self.age) 

x = Static("Ephexeve", "M").printInfo() 

Wyjścia:

Traceback (most recent call last): 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module> 
    x = Static("Ephexeve", "M").printInfo() 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo 
    return "Hello %s, your age is %s" % (self.first + self.last, self.age) 
NameError: global name 'self' is not defined 

Przykład drugi:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(first, last, age = randint(0, 50)): 
     print "Hello %s, your age is %s" % (first + last, age) 
     return 

x = Static("Ephexeve", "M") 
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different. 

Wyjścia

Hello Ephexeve M, your age is 18 

Widzę, że nie mogę nazwać żadnego self.attribute w staticstars, po prostu nie jestem pewien, kiedy i dlaczego go użyć. Moim zdaniem, jeśli utworzysz klasę z kilkoma przypisanymi, być może będziesz chciał użyć ich później i nie będziesz miał metody statycznej, w której wszystkie atrybuty nie będą dostępne. Ktoś może mi to wyjaśnić? Python jest moim pierwszym programistycznym langunge, więc jeśli jest taki sam w Javie, na przykład, nie wiem.

+0

Nienawidzę głosować, aby zamknąć, ale odpowiedzi w pytaniu, do którego dodałem, są całkiem dobre. Zwróć uwagę, że '@ classmethod' jest podobne do javas' static'. '@ staticmethod' jest praktycznie bezużyteczne. –

+0

Dzięki Josh, może nie przeszukaliśmy poprawnie, dzięki za link, sprawdzi teraz –

Odpowiedz

8

Co chcesz osiągnąć z tego staticmethod? Jak się spodziewasz, że rozwiąże to twój problem, jeśli nie wiesz, co robi?

A może po prostu grając, aby zobaczyć co staticmethod robi? W takim przypadku prawdopodobnie byłoby bardziej produktywne, gdyby read the docs zostało powiedziane, co robi, zamiast losowo go stosować i próbować odgadnąć, co się dzieje.

W każdym przypadku stosowania @staticmethod do definicji funkcji w klasie sprawia, że ​​„metody statyczne”. "Statyczny" jest niestety jednym z najbardziej myląco przeciążonych terminów w programowaniu; tutaj oznacza to, że metoda nie zależy ani nie zmienia stanu obiektu. Jeśli mam metody statyczne foo zdefiniowane w klasie Bar, następnie wywołanie bar.foo(...) (gdzie bar jest jakaś instancja klasy Bar) zrobi dokładnie to samo, niezależnie od tego, jakie atrybuty bar „s zawierać. Rzeczywiście mogę to nazwać bezpośrednio z klasy jako Bar.foo(...), gdy nie mam nawet instancji!

Osiąga się to po prostu nie przechodząc wystąpienie w sposób statyczny, a zatem metody statycznej nie parametr self. rzadko są konieczne, ale czasami wygodne

metody statyczne. Są one naprawdę takie same jak proste funkcje zdefiniowane poza klasą, ale umieszczenie ich w klasie oznacza je jako "powiązane" z klasą. Zwykle używasz ich do obliczania lub robienia rzeczy, które są ściśle związane z klasą, ale w rzeczywistości nie są operacjami na jakimś konkretnym obiekcie.