Decoradores @staticmethod y @classmethod en Python
Clase 15 de 17 • Curso de Python Orientado a Objetos
Resumen
Domina cómo aplicar los decoradores @staticmethod y @classmethod en Python para escribir clases claras y reutilizables. Verás cómo centralizar utilidades como validar ISBN y cómo crear constructores alternativos que generan instancias con reglas específicas, sin depender de objetos previos.
Métodos estáticos y de clase en Python: organiza utilidades y crea instancias de forma flexible.
¿Qué es un static method y cómo validar ISBN en Python?
Un método estático encapsula lógica que no usa estado de instancia. No recibe self
. Es perfecto para utilidades y validaciones puras. Aquí, Biblioteca.validar_isbn
comprueba que un ISBN tenga al menos diez caracteres con len
y retorna True
o False
.
# biblioteca.py
class Biblioteca:
@staticmethod
def validar_isbn(isbn: str) -> bool:
return len(isbn) >= 10
¿Cómo se llama y se prueba el método estático?
Se invoca desde la clase, sin instanciar. Se imprime el resultado para verificar la lógica.
# main.py
from biblioteca import Biblioteca
resultado = Biblioteca.validar_isbn("12345")
print("El ISBN es válido:", resultado) # False
resultado = Biblioteca.validar_isbn("1234567890")
print("El ISBN es válido:", resultado) # True
Claves prácticas: usa el decorador @staticmethod, evita self
, agrupa utilidades relacionadas en la clase Biblioteca
, y llama como Biblioteca.validar_isbn(valor)
.
¿Cómo usar un class method como constructor alternativo en la clase libro?
Un método de clase opera a nivel de clase y recibe el parámetro cls
. Permite crear constructores alternativos que devuelven nuevas instancias con configuraciones predefinidas. En Libro
, crear_no_disponible
construye un objeto con disponible=False
sin tocar el constructor principal.
# libro.py
class Libro:
@classmethod
def crear_no_disponible(cls, titulo, autor, isbn):
return cls(titulo, autor, isbn, disponible=False)
¿Cómo instanciar con el método de clase en main.py?
Se llama directamente desde la clase y se verifica el atributo disponible
.
# main.py
from libro import Libro
libro_no_disp = Libro.crear_no_disponible(
titulo="Libro de prueba",
autor="Autor de prueba",
isbn="1234567890",
)
print("Libro disponible:", libro_no_disp.disponible) # False
Puntos clave: decorador @classmethod, uso de cls
para crear instancias, retorno del objeto y acceso a atributos como disponible
.
¿Cuáles son las diferencias clave entre staticmethod y classmethod?
Comprender las diferencias ayuda a separar la lógica de clase de la lógica de instancias, mejorando organización y mantenimiento.
- Ámbito:
@staticmethod
no usaself
nicls
.@classmethod
recibecls
. - Propósito:
@staticmethod
sirve para utilidades como validar ISBN conlen
.@classmethod
crea instancias con reglas propias, como un constructor alternativo. - Invocación: ambos se llaman desde la clase. No requieren instancia previa.
- Organización: centralizan validaciones y fábricas en sus clases (
Biblioteca
,Libro
). - Salida:
@staticmethod
retorna valores (por ejemplo,True
/False
).@classmethod
retorna objetos configurados.
¿Te animas a aplicarlo? Crea un método de clase en Estudiante
para generar un estudiante en una carrera específica y comparte tu código en los comentarios.