Класс типов Python

Краткое содержание: в этом уроке вы узнаете о классе типов Python и поймете, как Python использует класс типов для создания других классов.

Введение в класс типов Python

В Python класс — это объект класса type. Например, ниже определен класс Person с двумя методами __init__ и 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.'
Code language: Python (python)

Класс Person является объектом класса type, как показано в следующем утверждении:

print(type(Person))
Code language: Python (python)

Вывод:

<class 'type'>
Code language: Python (python)

Класс Person является экземпляром класса type:

print(isinstance(Person, type))
Code language: Python (python)

Python использует класс type для создания других классов. Сам класс type является вызываемым. Ниже показан один из конструкторов класса типа:

type(name, bases, dict) -> a new type
Code language: Python (python)

Конструктор имеет три параметра для создания нового класса:

  • name: это имя класса, например, Person
  • bases — кортеж, содержащий базовые классы нового класса. Например, Person наследуется от класса object, поэтому bases содержит один класс (object,).
  • dict — это пространство имен класса.

Технически, вы можете использовать класс type для динамического создания класса. Прежде чем это сделать, необходимо понять, как Python создает классы.

Когда интерпретатор Python встречает в коде определение класса, он:

  • Во-первых, извлечет тело класса в виде строки.
  • Во-вторых, создаст словарь класса для пространства имен класса.
  • В-третьих, выполнит тело класса, чтобы заполнить словарь класса.
  • Наконец, создаст новый экземпляр типа, используя вышеупомянутый конструктор type().

Давайте проделаем описанные выше шаги, чтобы динамически создать класс Person:

Во-первых, извлеките тело класса:

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.' """
Code language: Python (python)

Во-вторых, создайте словарь класса:

class_dict = {}
Code language: Python (python)

В-третьих, выполните тело класса и заполните словарь класса:

exec(class_body, globals(), class_dict)
Code language: Python (python)

Функция exec() выполняет тело класса и заполняет глобальное пространство имен и пространство имен класса.

Наконец, создайте новый класс Person с помощью конструктора type:

Person = type('Person', (object,), class_dict)
Code language: Python (python)

Обратите внимание, что Person — это класс, который также является объектом. Класс Person наследуется от класса object и имеет пространство имен class_dict.

Ниже показан тип класса Person, который является классом type:

<class 'type'>
Code language: Python (python)

И является экземпляром класса type:

print(isinstance(Person, type))
Code language: Python (python)

Вывод:

True
Code language: Python (python)

В class_dict есть две функции __init__ и greeting:

{'__init__': <function __init__ at 0x0000024E28465160>, 'greeting': <function greeting at 0x0000024E28931550>}
Code language: Python (python)

Person.__dict__ также содержит эти функции:

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>})
Code language: Python (python)

В этом примере Python динамически создает класс type, который является тем же самым, который вы определяете статически в коде.

Поскольку класс type создает другие классы, мы часто называем его метаклассом. Метакласс — это класс, используемый для создания других классов.

Резюме

  • В Python класс — это экземпляр класса типа.
  • Класс типа создает другие классы, поэтому его называют метаклассом.

Оцените статью
devanswers.ru
Добавить комментарий