2012-06-06 20 views
8

Duplicar posible:
What is the difference between @staticmethod and @classmethod in Python?Métodos estáticos de Python, ¿por qué?

tengo algunas preguntas acerca de staticmethods en clases. Comenzaré dando un ejemplo.

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

Salidas:

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 

Ejemplo dos:

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. 

Salidas

Hello Ephexeve M, your age is 18 

Veo que no puedo llamar a ningún atributo propio en un método estático, realmente no estoy seguro de cuándo y por qué usarlo. En mi opinión, si creas una clase con algunas atribuidas, tal vez quieras usarlas más adelante, y no tener un método estático en el que no se puedan llamar todos los atributos. ¿Alguien me puede explicar esto? Python es mi primer langunge de programación, así que si esto es lo mismo en Java, por ejemplo, no lo sé.

+0

Odio votar para cerrar, pero las respuestas a la pregunta a la que me he vinculado son bastante buenas. Tenga en cuenta que '@ classmethod' es similar a javas' static'. '@ staticmethod' es bastante inútil. –

+0

Gracias Josh, tal vez no he buscado correctamente, gracias por el enlace, comprobaré ahora –

Respuesta

8

¿Qué intentas lograr con ese staticmethod? ¿Cómo esperas que resuelva tu problema si no sabes lo que hace?

¿O simplemente estás jugando para ver qué hace staticmethod? En ese caso, probablemente sea más productivo decir read the docs lo que hace, en lugar de aplicarlo aleatoriamente y tratar de adivinar el comportamiento de lo que hace.

En cualquier caso, aplicar @staticmethod a una definición de función en una clase hace un "método estático". "Estático" es lamentablemente uno de los términos sobrecargados más confusos en la programación; aquí significa que el método no depende ni altera el estado del objeto. Si tengo un método estático foo definido en una clase Bar, llamar a bar.foo(...) (donde bar es una instancia de la clase Bar) hará exactamente lo mismo independientemente de los atributos de bar. De hecho, puedo llamarlo directamente desde la clase como Bar.foo(...) cuando ni siquiera tengo una instancia.

Esto se logra simplemente al no pasar la instancia al método estático, por lo tanto, los métodos estáticos no tienen el parámetro self.

Los métodos estáticos rara vez son necesarios, pero a veces son convenientes. En realidad son lo mismo que las funciones simples definidas fuera de la clase, pero ponerlas en la clase las marca como "asociadas" a la clase. En general, los usaría para calcular o hacer cosas que están estrechamente relacionadas con la clase, pero en realidad no son operaciones en algún objeto en particular.

Cuestiones relacionadas