IOKELU
Nivel: Avanzado – Guía 11
💡 Prueba el código:
Ejecuta cualquier ejemplo en nuestra consola interactiva: Abrir consola de Python →

Metaprogramación en Python

La metaprogramación consiste en escribir código que modifica o genera código. Python ofrece herramientas poderosas como introspección, modificación dinámica de clases, metaclases, atributos mágicos y manipulación del namespace. Esta guía te enseña cómo funcionan y cómo aplicarlos profesionalmente.

Tabla de contenidos

  • Introspección
  • Modificación dinámica de clases
  • Atributos mágicos
  • Metaclases
  • type() como constructor de clases
  • Decoradores + metaprogramación
  • Ejercicios
  • Mini‑proyecto

1. Introspección

Python permite inspeccionar objetos en tiempo de ejecución.

x = 10
print(type(x))
print(dir(x))
print(hasattr(x, "__add__"))

2. Modificación dinámica de clases

class Persona:
    pass

def saludar(self):
    return "Hola!"

Persona.saludar = saludar

p = Persona()
print(p.saludar())

3. Atributos mágicos

class Demo:
    def __getattr__(self, nombre):
        return f"El atributo {nombre} no existe"

d = Demo()
print(d.xyz)

4. Metaclases

Una metaclase controla cómo se crea una clase.

class Meta(type):
    def __new__(cls, nombre, bases, attrs):
        attrs["creado_por"] = "Meta"
        return super().__new__(cls, nombre, bases, attrs)

class Ejemplo(metaclass=Meta):
    pass

print(Ejemplo.creado_por)

5. type() como constructor de clases

def hablar(self):
    return "Hola desde type"

Clase = type("Clase", (), {"hablar": hablar})

c = Clase()
print(c.hablar())

6. Decoradores + metaprogramación

def agregar_metodo(func):
    def wrapper(cls):
        cls.nuevo = func
        return cls
    return wrapper

@agregar_metodo(lambda self: "Método agregado")
class Demo:
    pass

print(Demo().nuevo())

7. Ejercicios

8. Mini‑proyecto: ORM mínimo con metaclases

class ModeloMeta(type):
    def __new__(cls, nombre, bases, attrs):
        campos = {k:v for k,v in attrs.items() if isinstance(v, str)}
        attrs["_campos"] = campos
        return super().__new__(cls, nombre, bases, attrs)

class Usuario(metaclass=ModeloMeta):
    nombre = "str"
    email = "str"

u = Usuario()
print(u._campos)

Siguiente guía

Reflexión e introspección →