ProgramaciónDesarrollador Python

Explique la diferencia entre un método de clase (@classmethod), un método estático (@staticmethod) y un método de instancia normal en Python. ¿Cuándo y qué elegir?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

  • Método de instancia normal — recibe como primer argumento self, es decir, una referencia al objeto concreto. Se utiliza para acceder/modificar el estado del objeto.
  • @classmethod recibe como primer argumento cls — una referencia a la clase misma, no al objeto. Se aplica para métodos de fábrica o métodos que funcionan con la clase en general.
  • @staticmethod no recibe argumentos implícitos. Es una función normal que se coloca en el espacio de la clase — para agrupación lógica.

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 trampa.

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.

Ejemplos de errores reales debido al desconocimiento de los matices del tema.


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.