type
.__new__
(или __init__
) в метаклассе, чтобы задать логику создания класса (добавить атрибуты, методы и т.д.).metaclass=YourMetaClass
.__new__
можно изменять словарь attrs
(имя:значение), который содержит атрибуты и методы создаваемого класса, добавляя или удаляя их. Это позволяет, например, автоматически регистрировать классы, применять паттерны проектирования, или валидировать структуру классов во время их определения.
Метаклассы в Python позволяют контролировать процесс создания классов. Они являются "классами классов". Их основное назначение - динамически изменять или создавать классы во время их определения.
Как это работает:
Пример:
class MyMeta(type):
def __new__(cls, name, bases, attrs):
# Добавляем атрибут 'description' ко всем классам, созданным с помощью MyMeta
attrs['description'] = "Этот класс создан с использованием метакласса MyMeta"
# Создаем новый класс с измененными атрибутами
return super().__new__(cls, name, bases, attrs)
def __init__(cls, name, bases, attrs):
# Валидация имени класса. Например, оно должно начинаться с заглавной буквы.
if not name[0].isupper():
raise ValueError("Имя класса должно начинаться с заглавной буквы")
super().__init__(name, bases, attrs)
class MyClass(metaclass=MyMeta):
pass
class AnotherClass(metaclass=MyMeta):
x = 10
# Попытка создать класс с именем, начинающимся со строчной буквы, вызовет исключение ValueError
# class invalid_class(metaclass=MyMeta):
# pass
print(MyClass.description) # Вывод: Этот класс создан с использованием метакласса MyMeta
print(AnotherClass.description) # Вывод: Этот класс создан с использованием метакласса MyMeta
print(AnotherClass.x) # Вывод: 10
Области применения:
Когда следует использовать метаклассы:
Метаклассы - продвинутый инструмент. Их следует использовать только тогда, когда необходимо глубоко контролировать процесс создания классов и когда другие подходы (например, наследование) не подходят. В большинстве случаев, обычное наследование классов является достаточным.