Metaclasses em Python

Rayven Esplanada 10 agosto 2021
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.

Rayven Esplanada avatar Rayven Esplanada avatar

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

Artigo relacionado - Python Class