Las metaclases en Python son clases que crean otras clases. Si una clase es una plantilla para objetos, una metaclase es una plantilla para la creación de clases. Gracias a ellas, se puede definir programáticamente cómo se crean y modifican las clases.
En Python, todo es un objeto, incluidas las clases. Esto permite definir la lógica de creación, modificación y control de clases en el momento de su generación. Mecanismos similares ya se han utilizado en otros lenguajes, pero en Python se implementan de manera especialmente sencilla y elegante a través del mecanismo de las metaclases.
A veces, en grandes proyectos, las clases deben construirse según reglas especiales o incluir métodos y propiedades obligatorios, o modificarse automáticamente al ser definidas. Sin metaclases, esto conduciría a la duplicación de código y a la proliferación de errores.
Las metaclases permiten modificar la creación de clases mediante la sobreescritura de métodos de la clase type, como new y init. Se pueden añadir métodos y propiedades automáticamente, validar la estructura, aplicar reflexión.
class UpperAttrMeta(type): def __new__(cls, name, bases, dct): new_attrs = {} for key, value in dct.items(): if not key.startswith('__'): new_attrs[key.upper()] = value else: new_attrs[key] = value return super().__new__(cls, name, bases, new_attrs) class Foo(metaclass=UpperAttrMeta): bar = 'bip' print(hasattr(Foo, 'bar')) # False print(hasattr(Foo, 'BAR')) # True
metaclass en la declaración de la clase¿Se puede cambiar la metaclase de una instancia después de crear la clase? No. Después de crear la clase, no se puede cambiar su metaclase sin regenerar la propia clase. La instancia utiliza la metaclase definida para su clase.
¿En qué se diferencian las metaclases de los decoradores de clases? Los decoradores de clases pueden cambiar una clase después de que ha sido creada, mientras que las metaclases gestionan el propio proceso de creación y pueden incluso prohibir la creación de la clase o cambiar sus clases base.
¿Debe cada clase tener su propia metaclase?
No. Normalmente se utiliza el estándar type, la metaclase es necesaria solo cuando es necesario alterar el comportamiento por defecto.
Pros:
Caso negativo: Un arquitecto principiante comenzó a usar metaclases para tareas simples (por ejemplo, autogeneración de str), en lugar de decoradores. Pros: dominó una nueva herramienta. Contras: sobrecargó al equipo con magia innecesaria, aparecieron errores.
Caso positivo: En una compleja ORM se utilizó una metaclase para la autogeneración de tablas a partir de clases de Python. Pros: control centralizado de la estructura, actualización automática de los mapeos. Contras: se requirió una documentación detallada y capacitación para los nuevos miembros del equipo.