Al integrar una aplicación Django que no había usado antes, encontré dos formas diferentes de definir funciones en las clases. El autor parece usar ambos de manera muy intencional. La primera de ellas es que yo mismo uso mucho:¿Cuándo debería usar @classmethod y when def method (self)?
class Dummy(object):
def some_function(self,*args,**kwargs):
do something here
self is the class instance
La otra es que yo no uso, sobre todo porque no entiendo cuándo usarlo, y para qué:
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
do something here
cls refers to what?
en la documentación de Python classmethod
el decorador se explica con esta frase:
un método de clase recibe la clase como primer argumento implícito, simplemente como un método de instancia recibe la instancia.
así que supongo que se refiere a cls
Dummy
sí (el class
, no el ejemplo). No entiendo exactamente por qué existe, porque siempre podría hacer esto:
type(self).do_something_with_the_class
¿Es sólo por el bien de la claridad, o no se me olvida la parte más importante: las cosas espeluznantes y fascinantes que no podían ser hecho sin ella?
Agradable: Me gusta que la respuesta se divida en cómo, por qué. Por lo que tengo, ahora @classmethod permite acceder a la función sin la necesidad de una instancia. Esto es exactamente lo que estaba buscando, gracias. – marue
@marue ¡De nada! – Marcin
Diría que llamar a los métodos de clase en instancias es un mal estilo de codificación, simplemente no hay razón para hacerlo y solo puede causar confusión. Pero sí, funciona (java permite lo mismo, pero emite una advertencia de compilación cuando llama a métodos estáticos a través de instancias) – Voo