Перейти к содержанию

Начало урока

Метаклассы и ABC

Управление тем, как строятся и ведут себя сами классы

Главная идея: В Python класс — это не жёстко высеченный в камне чертёж, а объект, который сам создаётся во время выполнения другим классом, называемым его метаклассом. Понимание этого позволяет встроиться в процесс создания класса: регистрировать подклассы, проверять интерфейсы или внедрять поведение. Абстрактные базовые классы (ABC) — это повседневное, хорошо освещённое лицо этого механизма: они позволяют объявить контракт обязательных методов и заставить Python его соблюдать. В большинстве случаев правильный инструмент — это ABC или __init_subclass__; написанный вручную метакласс — это тяжёлая артиллерия, к которой прибегают редко и обдуманно.
К концу вы сможете:
  • объяснить цепочку экземпляр -> класс -> метакласс и почему type находится на вершине,
  • создавать класс динамически с помощью type(name, bases, namespace),
  • использовать __init_subclass__ для перехвата создания подкласса без метакласса,
  • определять и обеспечивать интерфейс с помощью abc.ABC и @abstractmethod,
  • писать собственный метакласс и, что важнее всего, оценивать, когда он действительно оправдан.

1. Класс тоже объект

Вы уже знаете, что каждое значение в Python — это объект со своим типом: type(3) — это int, type("hi") — это str. Шаг, который упускают большинство разработчиков, состоит в том, что это относится и к самим классам. Класс — это объект времени выполнения, и его тип называется метаклассом. По умолчанию этот метакласс — встроенный type.

class Dog:
    pass

fido = Dog()

print(type(fido))   # <class '__main__.Dog'>
print(type(Dog))    # <class 'type'>
print(type(type))   # <class 'type'>  -- type -- сам себе тип

Итак, есть цепочка: экземпляр является экземпляром класса, а класс является экземпляром метакласса. Поскольку Dog сам является объектом, вы можете присвоить его переменной, поместить в список, добавить к нему атрибуты и — ключевое озарение — можете построить его программно, а не с помощью ключевого слова class.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя