e modificar ele mesmo • Escrever código que manipula as construções da linguagem (classes, funções, variáveis de instancia, módulos) • Código que manipula código!
funções, tipos, módulos) • Os objetos tem métodos mágicos (obj.__new__, obj.__prepare__) • Python tem suporte a closures • Desde a versão 3, Python tem suporte a annotations
**kwargs): for key, param in enumerate(signature(func).parameters.values()): if not isinstance(args[key], param.annotation): raise Exception('Expected %s type and %s received ' % (type(args), param.annotation)) return func(*args, **kwargs) return wrap
class Logger(type): def __init__(self, namespece, bases, attributes): for key in attributes: func = attributes[key] if isfunction(func): print(func.__name__, datetime.now())