Python Понятие метакласс и работа с ними


#1

Можете объяснить, что такое метакласс в Python и зачем они нужны. Просматривал эту тему, но я так и не понял, как сними нужно работать.


#2

Метакласс - это класс класса. Как класс определяет поведение экземпляра класса, метакласс определяет поведение класса. Класс является экземпляром метакласса.

В то время как в Python мы можем использовать произвольные вызовы для метаклассов, более полезный подход заключается в том, чтобы фактически сделать его самим классом. type - это обычный метакласс в Python. Нельзя воссоздать что-то вроде type исключительно в Python, но Python немного обманывает. Чтобы создать свой собственный метакласс в Python, мы просто можем использовать подкласса type.

Метакласс чаще всего используется как фабрика классов. Подобно тому, как мы создаем экземпляр класса, вызывая класс, Python создает новый класс (когда он выполняет оператор 'class'), вызывая метакласс. В сочетании с обычными методами __init__ и __new__ метаклассы, таким образом, позволяют создавать "дополнительные вещи" при создании класса, такие как регистрация нового класса в каком-либо реестре или даже полностью заменить класс чем-то другим.

Когда выполняется оператор class, Python сначала выполняет тело оператора class как обычный блок кода. Результирующее пространство имен содержит атрибуты будущего класса. Метакласс определяется путем просмотра базовых классов будущего класса (метаклассы наследуются), атрибута __metaclass__ класса (если есть) или глобальной переменной __metaclass__. Затем метакласс вызывается с именем, основами и атрибутами класса, чтобы создать его экземпляр.

Тем не менее, метаклассы фактически определяют тип класса, а не просто фабрику для него, так что с ними можно создать гораздо больше. Например, мы можем определить нормальные методы в метаклассе. Эти метакласс-методы похожи на методы класса, в том смысле, что их можно вызывать в классе без экземпляра, но они также не похожи на методы класса, поскольку их нельзя вызывать в экземпляре класса. type.__subclasses__() - это пример метода метакласса type. Вы также можете определить обычные "магические" методы, такие как __add__, __iter__ и __getattr__, для реализации или изменения поведения класса.