Inicio > Cursos > Python > Metaclases y Gestión de Memoria
PythonPython Avanzado y AplicacionesLección 20 de 24

Metaclases y Gestión de Memoria

En Python, todo es un objeto — incluso las clases. Una metaclase es "la clase de una clase": define cómo se crean las clases. Por defecto todas las clases usan type como metaclase. Cuando creas class MiClase: pass, Python internamente ejecuta type("MiClase", (object,), {}). Puedes crear metaclases personalizadas para validar, registrar o modificar clases al momento de crearlas.

Memoria en Python: cada objeto lleva la cuenta de cuántas variables apuntan a él (reference counting). Cuando llega a 0, Python lo borra solo. Para objetos que se apuntan entre sí en círculo hay un recolector de basura (garbage collector, módulo gc) que los limpia. • sys.getrefcount(obj) → cuántas referencias tiene obj (suele dar 1 más de lo esperado, porque la propia llamada cuenta) • gc.collect() → fuerza la limpieza • weakref.ref(obj) → referencia "débil" que no impide que obj se borre • __slots__ = ("x", "y") → la clase solo admite esos atributos y gasta menos memoria

# Metaclase: controla cómo se crean las clases
class RegistroMeta(type):
    _registro = {}

    def __new__(mcs, nombre, bases, namespace):
        cls = super().__new__(mcs, nombre, bases, namespace)
        if nombre != "Base":  # No registrar la base
            mcs._registro[nombre] = cls
            print(f"Clase registrada: {nombre}")
        return cls

class Base(metaclass=RegistroMeta):
    pass

class Usuario(Base):   # Se registra automáticamente
    pass

class Producto(Base):  # Se registra automáticamente
    pass

print(RegistroMeta._registro)
# {"Usuario": <class Usuario>, "Producto": <class Producto>}

# __slots__ — ahorra memoria (no crea __dict__)
class Punto:
    __slots__ = ("x", "y")  # Solo permite x, y
    def __init__(self, x, y):
        self.x = x
        self.y = y
    # self.z = 1 → AttributeError

# Gestión de memoria
import sys
import gc

a = [1, 2, 3]
print(sys.getrefcount(a))  # Referencias al objeto
print(sys.getsizeof(a))    # Bytes en memoria

# Forzar recolección de basura
gc.collect()
print(gc.get_stats())  # Estadísticas del GC

# weakref — referencia que no evita la eliminación
import weakref

class Cache:
    def __init__(self, valor):
        self.valor = valor

obj = Cache("datos")
ref = weakref.ref(obj)
print(ref().valor)   # "datos"
del obj
print(ref())         # None — fue recolectado
Consejo🧠 Las metaclases son poderosas pero complejas. Úsalas solo cuando necesites controlar la creación de clases: ORMs, frameworks, registros automáticos. Para el 99% de los casos, decoradores de clase son suficientes.
← Concurrencia Asíncrona (asyncio)Proyecto: API REST con Python →

Practica esta lección

Resuelve los ejercicios del curso de Python en la app, gratis y con corrección automática.

Empezar a practicar