MetaclasseEm orientação a objetos, uma metaclasse é uma classe cujas instâncias também são classes e não objetos no sentido tradicional. Assim como classes definem o comportamento de certos objetos, metaclasses definem o comportamento de certas classes e suas instâncias. Nem toda linguagem orientada a objeto suporta metaclasses. Entre as que suportam, a extensão de modificações que podem ser feitas nas classes varia. Cada linguagem possui seu próprio protocolo de metaobjeto, um conjunto de regras que definem como objetos, classes e metaclasses interagem. Exemplo em PythonEm Python, a classe nativa class Carro(object):
__slots__ = ['marca', 'modelo', 'ano', 'cor']
def __init__(self, marca, modelo, ano, cor):
self.marca = marca
self.modelo = modelo
self.ano = ano
self.cor = cor
@property
def descricao(self):
""" Retorna uma descrição do carro. """
return "%s %s %s %s" % (self.cor, self.ano, self.marca, self.modelo)
Em tempo de execução, O exemplo acima contém código redundante relacionado aos quatro atributos class TipoIniciaAtributo(type):
def __call__(self, *args, **kwargs):
""" Cria uma nova instância. """
# Primeiro, cria um objeto da forma padrão.
obj = type.__call__(self, *args)
# Adicionalmente, configura-se atributos do novo objeto.
for nome in kwargs:
setattr(obj, nome, kwargs[nome])
# Retorna o novo objeto.
return obj
Essa metaclasse modifica a criação do objeto. Todos os outros aspectos do comportamento da classe e dos objetos ainda seguem o que foi definido por Agora a classe class Carro(object):
__metaclass__ = TipoIniciaAtributo
__slots__ = ['marca', 'modelo', 'ano', 'cor']
@property
def descricao(self):
""" Retorna uma descrição do carro. """
return "%s %s %s %s" % (self.cor, self.ano, self.marca, self.modelo)
Objetos carros = [
Carro(marca='Toyota', modelo='Prius', ano=2005, cor='green'),
Carro(marca='Ford', modelo='Prefect', ano=1979, cor='blue')]
Suporte em linguagensAs seguintes linguagens de programação suportam metaclasses:
Ver também |