Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Metaclases Python: Profundizando en las clases

En Python, casi todo es un objeto: listas, funciones, clases... ¡Incluso las clases mismas son objetos! Pero, ¿alguna vez te has preguntado cómo se crean esas clases y cómo podríamos modificar ese proceso?

Las metaclases nos permiten hacer justamente eso. En este capítulo, aprenderemos qué son, para qué sirven y cómo crear nuestras propias metaclases con ejemplos prácticos.


¿Qué es una metaclase?

La metaclase es simplemente una clase que crea clases. Tal cual. Así como una clase crea objetos, una metaclase crea clases.

En Python, cuando definimos una clase con la palabra clave class, en realidad estamos creando un objeto. Ese objeto es creado por un constructor de clases, que normalmente es un tipo especial llamado type.

¿Cómo Python crea una clase?

Cuando hacemos esto:

class MiClase:
    pass

Python hace, por detrás, algo muy parecido a esto:

MiClase = type('MiClase', (), {})

Donde:

  • 'MiClase' es el nombre del nuevo objeto de clase.
  • () es una tupla con las clases de las que hereda (en este caso ninguna; hereda de object por defecto).
  • {} es un diccionario con los atributos y métodos de la clase.

Entonces sí: type es una metaclase. Vamos a ver un ejemplo:

def mi_metodo(self):
    print("Hola mundo")

# Creamos la clase usando type
MiClase = type('MiClase', (), {'mi_metodo': mi_metodo})

obj = MiClase()
obj.mi_metodo()  # Imprime "Hola mundo"

Esto es exactamente lo mismo que si hubiéramos declarado la clase de manera "tradicional". Pero acá tenemos un control mucho más explícito sobre cómo se crea.


Crear nuestras propias metaclases

Hasta ahora hemos usado type, pero podemos crear nuestras propias metaclases. Para eso, heredamos de type y redefinimos algunos de sus métodos especiales, como new o init.

Veamos cómo hacerlo:

class MiMetaclase(type):
    def __init__(cls, nombre, bases, atributos):
        print(f"Creando la clase {nombre}")
        super().__init__(nombre, bases, atributos)

# Esta clase es creada con nuestra metaclase
class MiClase(metaclass=MiMetaclase):
    pass

Cuando Python procesa MiClase, llama al método init de MiMetaclase. El parámetro cls representa la clase que se está creando. Así podemos actuar justo en el momento en que Python crea una clase.

Parámetros del método __init__

Elemento Descripción
cls La clase que se está creando
nombre Nombre de la clase como cadena (ej. 'MiClase')
bases Clases base de las que hereda
atributos Diccionario con todos los atributos definidos

¿Y para qué sirven las metaclases?

Usar metaclases no es algo que hagamos todos los días. Pero cuando las usamos, es porque necesitamos modificar o controlar la forma como se crean las clases.

Un ejemplo muy conocido es el framework Django, uno de los más usados para hacer aplicaciones web en Python. Django utiliza metaclases para definir y manejar los modelos de base de datos.

Caso práctico: Modelos en Django

En Django, uno define modelos como clases comunes:

from django.db import models

class Persona(models.Model):
    nombre = models.CharField(max_length=100)
    edad = models.IntegerField()

Detrás de cámaras, Django detecta que estás usando models.Model como clase base, y eso activa una metaclase llamada ModelBase. Esa metaclase toma los atributos nombre y edad, y los transforma en columnas de una tabla SQL durante la creación del modelo.

No estás creando tablas a mano, ni escribiendo SQL. Solo escribes Python, y Django usa metaclases para generar todo lo demás.

Esta técnica permite que el código sea claro para el desarrollador, mientras que la lógica compleja se maneja automáticamente en el fondo.


¿Cuándo usar metaclases?

Veamos algunos casos donde podrían ser útiles:

  • Validar automáticamente que una clase tenga ciertos métodos o atributos.
  • Registrar clases automáticamente en algún sistema (por ejemplo, un plugin).
  • Aplicar decoración o modificación automática de métodos de clase.
  • Implementar un ORM como lo hace Django.

Recuerda que metaclases son poderosas, pero también complejas. Úsalas si tienes una necesidad real y el conocimiento para mantener ese tipo de código.


Resumen

  • En Python, las clases también son objetos, creados por metaclases.
  • El metaclase por defecto en Python es type.
  • Podemos usar type directamente para crear clases dinámicamente.
  • Para mayor control, podemos crear nuestras propias metaclases heredando de type.
  • Las metaclases sirven para modificar o extender la forma como se crean las clases.
  • Django usa metaclases para generar estructuras de base de datos a partir de clases comunes.
  • Aunque poderosas, las metaclases deben usarse con cuidado para no hacer el código difícil de leer o mantener.

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY