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
- Crea una metaclase que registre todas las clases creadas.
- Añade métodos dinámicamente según condiciones.
- Implementa __setattr__ para validar atributos.
- Crea clases con type() que tengan propiedades.
- Combina decoradores con metaclases.
# registro
class Reg(type):
clases = []
def __new__(c,n,b,a):
Reg.clases.append(n)
return super().__new__(c,n,b,a)
# setattr
def __setattr__(self,n,v):
if n == "edad" and v < 0: raise ValueError
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)