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