Что такое метакласс (metaclass)
Python
Senior
Без компании
Что такое метакласс (metaclass)
Ответы
**Метакласс** — это «класс классов», который определяет, как создаются и ведут себя другие классы. Это мощный механизм, позволяющий перехватывать и модифицировать процесс создания класса.
**Простая аналогия**
Если класс — это фабрика по созданию объектов (экземпляров), то метакласс — это фабрика по созданию фабрик (классов).
*Базовый пример*
Метакласс, который автоматически добавляет всем методам класса логирование:
```
class LoggingMeta(type):
def __new__(cls, name, bases, attrs):
# Перебираем все атрибуты класса
for attr_name, attr_value in attrs.items():
# Если это функция/метод - оборачиваем в логирование
if callable(attr_value):
attrs[attr_name] = cls.wrap_with_logging(attr_value)
# Создаем класс с модифицированными атрибутами
return super().__new__(cls, name, bases, attrs)
@staticmethod
def wrap_with_logging(method):
def wrapper(*args, **kwargs):
print(f"Вызов метода: {method.__name__}")
return method(*args, **kwargs)
return wrapper
# Используем наш метакласс
class MyClass(metaclass=LoggingMeta):
def method1(self):
return "Результат method1"
def method2(self):
return "Результат method2"
# Тестируем
obj = MyClass()
obj.method1() # Вывод: "Вызов метода: method1"
obj.method2() # Вывод: "Вызов метода: method2"
```
**Когда действительно нужны метаклассы?**
- Создание ORM (как в Django или SQLAlchemy)
- Регистрация плагинов/расширений
- Принудительная валидация структуры классов
- Создание API с автоматической генерацией методов