Ответ
В Python экземпляром метакласса является сам класс, а не его объект. Метакласс — это "фабрика классов", то есть класс, который определяет, как создаются другие классы.
1. Стандартный метакласс type
Все классы в Python по умолчанию являются экземплярами встроенного метакласса type
.
- Почему:
type
— это базовый метакласс, который предоставляет стандартный механизм создания классов, определяя их структуру и поведение на этапе определения.
Пример:
class MyClass:
"""Обычный класс."""
pass
# MyClass является экземпляром метакласса type
print(type(MyClass)) # Вывод: <class 'type'>
# Объект my_object является экземпляром MyClass
my_object = MyClass()
print(type(my_object)) # Вывод: <class '__main__.MyClass'>
Здесь MyClass
— это экземпляр type
, а my_object
— это экземпляр MyClass
.
2. Пользовательские метаклассы
Вы можете определить собственный метакласс, унаследовав его от type
. Это позволяет перехватывать и изменять процесс создания класса.
- Почему: Пользовательские метаклассы используются для реализации продвинутых паттернов, таких как автоматическая регистрация классов, внедрение методов, проверка структуры класса или изменение его поведения до того, как он будет полностью определен.
Пример:
class CustomMeta(type):
"""Пользовательский метакласс."""
def __new__(mcs, name, bases, namespace):
# Добавляем атрибут ко всем классам, созданным этим метаклассом
namespace['custom_attribute'] = "Hello from CustomMeta!"
return super().__new__(mcs, name, bases, namespace)
class MyCustomClass(metaclass=CustomMeta):
"""Класс, созданный с помощью CustomMeta."""
pass
# MyCustomClass является экземпляром метакласса CustomMeta
print(type(MyCustomClass)) # Вывод: <class '__main__.CustomMeta'>
print(MyCustomClass.custom_attribute) # Вывод: Hello from CustomMeta!
В этом примере MyCustomClass
является экземпляром CustomMeta
, который добавил ему новый атрибут custom_attribute
на этапе создания класса.
Таким образом, метаклассы предоставляют мощный механизм для метапрограммирования, позволяя контролировать и модифицировать процесс создания классов.