Resumo : neste tutorial, você aprenderá sobre a classe de tipo Python e entenderá como o Python usa a classe de tipo para criar outras classes.
Introdução à classe de tipo Python
Em Python, uma classe é um objeto da classe type
. Por exemplo, o seguinte define a Person
classe com dois métodos __init__
e greeting
:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greeting(self):
return f'Hi, I am {self.name}. I am {self.age} year old.'
Linguagem de código: Python ( python )
A Person
classe é um objeto da classe type
, conforme mostrado na seguinte instrução:
print(type(Person))
Linguagem de código: Python ( python )
Saída:
<class 'type'>
Linguagem de código: Python ( python )
A Person
classe é uma instância da type
classe:
print(isinstance(Person, type))
Linguagem de código: Python ( python )
Python usa a classe type para criar outras classes. A classe de tipo em si pode ser chamada. O seguinte mostra um dos construtores da classe de tipo:
type(name, bases, dict) -> a new type
Linguagem de código: Python ( python )
O construtor possui três parâmetros para criar uma nova classe:
name
: é o nome da classe, por exemplo, Pessoabases
é uma tupla que contém as classes base da nova classe. Por exemplo, a Pessoa herda da classe do objeto, então as bases contêm uma classe (objeto)dict
é o namespace da classe
Tecnicamente, você pode usar a type
classe para criar uma classe dinamicamente. Antes de fazer isso, você precisa entender como o Python cria as classes.
Quando o interpretador Python encontrar uma definição de classe no código, ele irá:
- Primeiro, extraia o corpo da classe como string.
- Segundo, crie um dicionário de classe para o namespace da classe.
- Terceiro, execute o corpo da classe para preencher o dicionário da classe.
- Finalmente, crie uma nova instância do tipo usando o
type()
construtor acima.
Vamos emular as etapas acima para criar uma Person
classe dinamicamente:
Primeiro, extraia o corpo da classe:
class_body = """
def __init__(self, name, age):
self.name = name
self.age = age
def greeting(self):
return f'Hi, I am {self.name}. I am {self.age} year old.'
"""
Linguagem de código: Python ( python )
Segundo, crie um dicionário de classe:
class_dict = {}
Linguagem de código: Python ( python )
Terceiro, execute o corpo da classe e preencha o dicionário da classe:
exec(class_body, globals(), class_dict)
Linguagem de código: Python ( python )
A exec()
função executa o corpo da classe e preenche os namespaces globais e de classe.
Finalmente, crie uma nova Person
classe usando o type
construtor:
Person = type('Person', (object,), class_dict)
Linguagem de código: Python ( python )
Observe que the Person
é uma classe, que também é um objeto. A Person
classe herda da object
classe e possui o namespace do class_dict
.
O seguinte mostra o tipo da Person
classe que é a type
classe:
<class 'type'>
Linguagem de código: Python ( python )
E é uma instância da type
classe:
print(isinstance(Person, type))
Linguagem de código: Python ( python )
Saída:
True
Linguagem de código: Python ( python )
O class_dict tem as duas funções __init__
e greeting
:
{'__init__': <function __init__ at 0x0000024E28465160>,
'greeting': <function greeting at 0x0000024E28931550>}
Linguagem de código: Python ( python )
O Person.__dict__
também contém estas funções:
mappingproxy({'__dict__': <attribute '__dict__' of 'Person' objects>,
'__doc__': None,
'__init__': <function __init__ at 0x00000165F7725160>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Person' objects>,
'greeting': <function greeting at 0x00000165F7F71550>})
Linguagem de código: Python ( python )
Neste exemplo, Python cria a type
classe dinamicamente, que é a mesma que você define estaticamente no código.
Como a type
classe cria outras classes, frequentemente nos referimos a ela como metaclasse . Uma metaclasse é uma classe usada para criar outras classes.
Resumo
- Em Python, uma classe é uma instância do tipo class.
- A classe de tipo cria outras classes, portanto, é chamada de metaclasse.