2012-06-06 26 views
8

Eventuali duplicati:
What is the difference between @staticmethod and @classmethod in Python?Metodi statici Python, perché?

ho alcune domande su staticmethods nelle classi. Inizierò dando un esempio.

Esempio uno:

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() 

Uscite:

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 

Esempio due:

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. 

uscite

Hello Ephexeve M, your age is 18 

Vedo che non posso chiamare alcun self.attribute in un metodo statico, non sono proprio sicuro di quando e perché usarlo. Nella mia mente, se crei una classe con pochi attributi, forse li vuoi usare in seguito, e non hai un metodo statico in cui tutti gli attributi non sono richiamabili. Chiunque può spiegarmi questo? Python è la mia prima lingua di programmazione, quindi se questo è lo stesso in Java, ad esempio, non lo so.

+0

L'odio per votare per chiudere, ma le risposte nella domanda che ho collegato sono abbastanza buone. Si noti che '@ classmethod' è simile a java' static'. '@ staticmethod' è praticamente inutile. –

+0

Grazie Josh, forse non ho cercato correttamente, grazie per il link, controlleremo ora –

risposta

8

Cosa stai cercando di ottenere con quello staticmethod? Come ti aspetti che risolva il tuo problema se non sai cosa fa?

Oppure stai solo giocando per vedere cosa fa staticmethod? In tal caso, sarebbe probabilmente più produttivo a read the docs informarsi su ciò che fa, piuttosto che applicarlo casualmente e cercare di indovinare dal comportamento che cosa fa.

In ogni caso, l'applicazione di @staticmethod a una definizione di funzione in una classe rende un "metodo statico". "Statico" è sfortunatamente uno dei termini più complicati della programmazione; qui significa che il metodo non dipende o modifica lo stato dell'oggetto. Se ho un metodo statico foo definito in una classe Bar, chiamare bar.foo(...) (dove bar è una istanza della classe Bar) farà esattamente la stessa cosa, indipendentemente dagli attributi di bar. Infatti posso chiamarlo direttamente dalla classe come Bar.foo(...) quando non ho nemmeno un'istanza!

Ciò si ottiene semplicemente non passando l'istanza nel metodo statico, pertanto i metodi statici non hanno il parametro self.

I metodi statici sono raramente necessari, ma a volte convenienti. Sono in realtà le stesse funzioni semplici definite al di fuori della classe, ma inserendole nella classe le identificano come "associate" alla classe. In genere li useresti per calcolare o fare cose strettamente correlate alla classe, ma in realtà non sono operazioni su qualche oggetto particolare.