En Python, hay tres tipos principales de métodos: métodos de instancia, métodos de clase y métodos estáticos. Históricamente, Python solo soportaba métodos de instancia (con el primer parámetro self). Con el tiempo, surgió la necesidad de tipos adicionales de métodos: que se puedan acceder a través de la clase sin estar vinculados a un objeto y con acceso a la propia clase.
Problema: a menudo se requiere crear métodos que no dependan del estado de una instancia de objeto (por ejemplo, métodos de fábrica) o que no necesiten contexto de clase, pero que lógicamente forman parte de la estructura de la clase.
Solución: se utilizan los decoradores @classmethod y @staticmethod.
Ejemplo de código:
class Example: def instance_method(self): return f'instancia: {self}' @classmethod def class_method(cls): return f'class: {cls}' @staticmethod def static_method(): return 'estático'
Características clave:
¿Puede un método estático acceder a los atributos de la clase y de la instancia?
No, un método estático no recibe referencia ni a la clase ni al objeto.
class A: x = 10 @staticmethod def f(): # print(self.x) # Error pass
¿Pueden los métodos de clase ser sobrescritos en las subclases?
Sí, al llamar a classmethod a través de un hijo, el primer argumento siempre será la clase efectiva, no la base.
class Base: @classmethod def name(cls): return cls.__name__ class Child(Base): pass Child.name() # "Child"
¿Por qué no se puede usar self para métodos de clase?
Porque el método de clase no está vinculado a un objeto específico, sino a la clase en general; self no está disponible sin crear una instancia.
Un método de fábrica se definió como staticmethod, y dentro se intenta crear una instancia de la clase a través de self, lo que lleva a errores o duplicación de código.
Pros:
Contras:
La fábrica se declara a través de classmethod, dentro se usa la clase efectiva (cls) para crear la instancia. Los herederos se crean correctamente a través de esta fábrica.
Pros:
Contras: