Metaclasses em Python

0 – Python
5 – Orientada a Objetos (POO)
5.1 – Classes e objetos
5.2 – Herança (simples e múltipla)
5.3 – Polimorfismo
5.4 – Encapsulamento (público, _protegido, __privado)
5.5 – Métodos mágicos (__init__, __call__, __add__, etc.)
5.6 – Propriedades (@property, setter, deleter)
5.7 – Classes abstratas (ABC, abstractmethod)
5.8 – Metaclasses (type, __new__)
LEGENDA
Nivel_1
Nivel_2
Nivel_3

Metaclasse é a classe de uma classe, assim como classe é de objeto. Ela define como as classes se comportam e são construídas. Primeiramente, type é a metaclasse padrão do Python. Por exemplo, type(MinhaClasse) retorna <class 'type'>. Além disso, você pode criar metaclasses personalizadas. A voz passiva é usada aqui: “as classes são criadas dinamicamente pela metaclasse”. Quando utilizar metaclasses? Em frameworks e bibliotecas complexas. Também para validação de classes ou registro automático. Metaclasses são um recurso avançado e poderoso. Vamos explorar type, __new__ e __init__ da metaclasse. Três subtítulos guiarão você por esse tópico profundo. Ao final, você entenderá o coração da orientação a objetos.

Type: a metaclasse padrão

type é a metaclasse de todas as classes em Python. Você pode criar classes dinamicamente com type(nome, bases, dicionário). Quando usar criação dinâmica? Em código gerado automaticamente. Também em metaprogramação avançada. A voz passiva é aplicada: “os atributos são passados como dicionário”. Exemplo de type como metaclasse:

type é a base de todo sistema de classes. Toda classe em Python é uma instância de type.

Criando metaclasses personalizadas

Uma metaclasse personalizada herda de type. Sobrescreva __new__ para interceptar a criação da classe. Use __init__ para modificar a classe após criada. Quando usar metaclasse personalizada? Em ORMs e frameworks web. Também para singletons ou validação de interfaces. A voz passiva é aplicada: “os atributos da classe são inspecionados”. Exemplo de metaclasse personalizada:

Metaclasses interceptam a criação de classes no nível mais alto. Elas são extremamente poderosas, mas use com moderação.

__new__ e __init__ na metaclasse

__new__ cria a classe antes dela existir. __init__ inicializa a classe já criada. __call__ controla a criação de instâncias. Quando usar cada um? __new__ para modificar a estrutura. __init__ para adicionar atributos ou métodos extras. __call__ para singletons ou pools de objetos. A voz passiva é aplicada: “os atributos são adicionados após a criação”. Exemplo completo com todos os métodos:

Metaclasses operam no momento da definição da classe. A fórmula de profundidade da metaprogramação: \(M = \text{objeto} \to \text{classe} \to \text{metaclasse} \to \text{type}\) Metaclasses são ferramentas avançadas para situações específicas. Use-as com sabedoria e documente bem seu propósito. Para 99% dos casos, herança e composição são suficientes. Mas quando precisar de poder real, as metaclasses estão lá.

Deixe um comentário