Metaclasses em Python
Este tutorial irá discutir o que são metaclasses em um contexto orientado a objetos em Python.
Metaclasses em Python
Simplificando, uma metaclasse define o comportamento de uma classe. Uma classe regular define como um objeto ou uma instância de uma classe se comporta.
Em Python, as metaclasses são pré-fabricadas e implícitas; isso significa que uma metaclasse é feita em segundo plano ao criar uma classe.
a classe base do object em Python
Em Python, toda classe criada herda implicitamente a classe base object. Dentro da classe object estão métodos privados integrados como __init__ e __new__. Antes mesmo de uma classe começar a criar seus próprios campos, funções e atributos, ela herda quaisquer atributos que existam na classe object.
Vamos criar uma nova classe, ChildObject, por exemplo. Dentro desta classe está uma declaração de um único atributo e uma única função.
class ChildObject:
num = 1
def printStatement():
print("This is a child object.")
Para verificar se a classe ChildObject herda quaisquer atributos e funções da classe object, use a função dir(), que retorna uma lista de todas as funções e atributos definidos em um objeto especificado.
print(dir(ChildObject))
Resultado:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'num', 'printStatement']
Observe que antes do atributo num e da função printStatement, existem alguns atributos e funções privadas que não são explicitamente definidos em ChildObject; isso significa que eles são ou implicitamente definidos dentro da classe ou são herdados da classe object.
Vamos verificar os atributos e funções da classe object usando a mesma função dir():
print(dir(object))
Resultado:
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
a Metaclasse type em Python
Agora que cobrimos a classe object, vamos discutir a metaclasse real em Python, type. Novamente, uma metaclasse é uma classe que instancia e define o comportamento de outra classe.
Duas funções podem expor a metaclasse de uma determinada classe: type() e __class__. Ambas as funções geram a classe do argumento fornecido.
Por exemplo, vamos usar as funções type() e __class__ na classe ChildObject fornecida dos exemplos acima.
class ChildObject:
num = 1
def printStatement():
print("This is a child object.")
print(type(ChildObject))
print(ChildObject.__class__)
Resultado:
<class 'type'>
<class 'type'>
Ambas as funções geram <class 'type'>. Isso sinaliza que a classe ChildObject é do tipo type. type é a metaclasse da classe ChildObject e qualquer outra classe nesse sentido.
Em resumo, type é a metaclasse que define implicitamente o comportamento de qualquer classe instanciada. Isso não é considerado de conhecimento comum porque é feito em segundo plano do código, sem a interferência do desenvolvedor. Portanto, o conceito de metaclasse só é conhecido se alguém se aprofundar no código-fonte e na documentação do Python.
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn