Ejemplo:
class MyClass: def instance_method(self): print(f"Instancia: {self}") @classmethod def class_method(cls): print(f"Clase: {cls.__name__}") @staticmethod def static_method(): print("Simple función") obj = MyClass() obj.instance_method() # self es obj MyClass.class_method() # cls es MyClass MyClass.static_method() # no hay self/cls
Pregunta frecuente:
¿Se puede llamar a un método de clase a través de una instancia? ¿En qué se diferencia de llamarlo a través de la propia clase?
Respuesta: Sí, se puede llamar a un método de clase tanto a través de una instancia como a través de la propia clase. No importa desde dónde se llame — el primer argumento siempre será la clase, no la instancia. Al llamar a través de una instancia, se pasa su clase como cls.
Historia
En el proyecto, todos los métodos de fábrica se hicieron estáticos (@staticmethod), pero dentro necesitaban conocer el nombre de la clase hija — resultó que era imposible. Se corrigió a @classmethod para obtener la referencia cls.
Historia
Para generar identificadores únicos de las instancias, usaron un método normal (self), y debían haber usado un método de clase, ya que el contador debería ser común para la clase, no para cada objeto.
Historia
Un desarrollador colocó lógica de negocio no relacionada con la clase en un método estático dentro de la clase. Otros no pudieron encontrar esta función, porque no la esperaban en el espacio de otra clase, lo que complicó el mantenimiento.