Introspecção e Reflexão: Analisando Objetos e Classes Dinamicamente em Python
1. Conceito de Introspecção
Introspecção é a habilidade de um programa examinar a si mesmo ou seus componentes em tempo de execução. Em Python, isso significa que você pode descobrir:
Tipos de objetos (
type
)Atributos e métodos disponíveis (
dir
)Hierarquia de classes (
mro
)Módulos importados e variáveis globais (
globals
,locals
)
Exemplo básico:
x = [1, 2, 3]
print(type(x)) # <class 'list'>
print(dir(x)) # lista de métodos e atributos da lista
2. Métodos Nativos para Introspecção
2.1 type()
e isinstance()
print(type(10)) # <class 'int'>
print(isinstance(10, int)) # True
type()
retorna a classe do objeto.isinstance()
verifica se um objeto é instância de uma classe ou suas subclasses.
2.2 dir()
Lista atributos e métodos disponíveis de um objeto ou classe.
class Pessoa:
def __init__(self, nome):
self.nome = nome
def falar(self):
print(f"{self.nome} falando")
print(dir(Pessoa))
2.3 getattr()
, setattr()
, hasattr()
p = Pessoa("Ana")
# Introspecção dinâmica de atributos
print(hasattr(p, "nome")) # True
print(getattr(p, "nome")) # Ana
# Modificando atributo dinamicamente
setattr(p, "idade", 28)
print(p.idade) # 28
Permite acessar ou modificar atributos dinamicamente, essencial para frameworks e ORMs.
2.4 callable()
print(callable(p.falar)) # True
print(callable(p.nome)) # False
Verifica se um objeto é chamável (função ou método).
2.5 __dict__
Contém atributos do objeto como dicionário.
print(p.__dict__)
# {'nome': 'Ana', 'idade': 28}
Útil para serialização ou introspecção avançada.
3. Reflexão em Python
Reflexão vai além da introspecção: você não apenas inspeciona, mas modifica objetos, classes ou funções em tempo de execução.
3.1 Criando Classes Dinamicamente com type()
# Criando uma classe dinamicamente
Atributos = {"x": 10, "mostrar": lambda self: print(self.x)}
MinhaClasse = type("MinhaClasse", (object,), Atributos)
obj = MinhaClasse()
obj.mostrar() # 10
type(nome_classe, tupla_classes_base, dicionario_atributos)
permite gerar classes dinamicamente.Muito usado em frameworks ORM e geração de APIs.
3.2 Modificando Classes e Objetos em Tempo de Execução
def novo_metodo(self):
print(f"Olá, {self.nome}")
# Adicionando método dinamicamente
setattr(Pessoa, "cumprimentar", novo_metodo)
p.cumprimentar() # Olá, Ana
Ferramenta poderosa para plugins, mixins dinâmicos e extensões de bibliotecas.
4. Hierarquia de Classes e MRO
__class__
retorna a classe de um objeto.__bases__
mostra classes base de uma classe.__mro__
exibe a ordem de resolução de métodos.
class A: pass
class B(A): pass
class C(B): pass
print(C.__bases__) # (<class '__main__.B'>,)
print(C.__mro__) # (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Essencial para entender herança múltipla e sobreposição de métodos.
5. Aplicações Profissionais
Django e SQLAlchemy usam introspecção para mapear atributos e criar tabelas automaticamente.
Descobrir métodos que começam com
test_
dinamicamente em testes unitários.
Listar atributos de objetos e registrar estado sem alterar código original.
Importar e registrar classes ou funções em tempo de execução.
Converter objetos para JSON usando
__dict__
e introspecção de atributos.
6. Ferramentas Complementares
inspect
módulo: fornece funções poderosas para introspecção.
import inspect
print(inspect.getmembers(p))
print(inspect.isfunction(Pessoa.falar))
print(inspect.signature(Pessoa.__init__))
globals()
elocals()
permitem acessar variáveis no escopo global ou local dinamicamente.
7. Boas Práticas
Use introspecção para automatizar ou reduzir duplicação, não para substituir lógica clara.
Evite alterar objetos de terceiros indiscriminadamente.
Combine introspecção com decorators e context managers para frameworks robustos.
Teste todas as modificações dinâmicas — erros podem ser difíceis de rastrear.
Documente claramente quando usar reflexão, para que o código não se torne obscuro.
8. Conclusão
Introspecção permite inspecionar objetos e classes dinamicamente.
Reflexão permite modificar ou criar objetos e classes em tempo de execução.
Ferramentas como
type
,getattr
,setattr
,__dict__
,__class__
,__mro__
einspect
são essenciais.Essencial para frameworks, plugins, ORMs, testes e depuração avançada.
Quando combinada com decorators, metaclasses e context managers, a introspecção torna Python extremamente poderoso e flexível.
Comentários
Postar um comentário