Classe do tipo Python

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 Personclasse 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 Personclasse é 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 Personclasse é uma instância da typeclasse:

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 typeLinguagem de código:  Python  ( python )

O construtor possui três parâmetros para criar uma nova classe:

  • name: é o nome da classe, por exemplo, Pessoa
  • basesé 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 typeclasse 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 Personclasse 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 Personclasse usando o typeconstrutor:

Person = type('Person', (object,), class_dict)Linguagem de código:  Python  ( python )

Observe que the Personé uma classe, que também é um objeto. A Personclasse herda da objectclasse e possui o namespace do class_dict.

O seguinte mostra o tipo da Personclasse que é a typeclasse:

<class 'type'>Linguagem de código:  Python  ( python )

E é uma instância da typeclasse:

print(isinstance(Person, type))Linguagem de código:  Python  ( python )

Saída:

TrueLinguagem 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 typeclasse dinamicamente, que é a mesma que você define estaticamente no código.

Como a typeclasse 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *