ENIGMA AI
ENIGMA AI
Python Сложный

Что такое метаклассы в Python?

Метаклассы в Python

Определение:
Метакласс — это "класс классов". Он определяет, как создаются и ведут себя классы.

Иерархия:

type → class → instance
(метакласс) → (класс) → (объект)
class MyClass:
    pass

obj = MyClass()

type(obj)      # <class 'MyClass'>
type(MyClass)  # <class 'type'>
type(type)     # <class 'type'>

Создание метакласса:

class MyMeta(type):
    def __new__(mcs, name, bases, namespace):
        # Вызывается при создании класса
        print(f"Creating class: {name}")
        return super().__new__(mcs, name, bases, namespace)

    def __init__(cls, name, bases, namespace):
        # Инициализация класса
        super().__init__(name, bases, namespace)

    def __call__(cls, *args, **kwargs):
        # Вызывается при создании экземпляра
        print(f"Creating instance of {cls.__name__}")
        return super().__call__(*args, **kwargs)

class MyClass(metaclass=MyMeta):
    pass

obj = MyClass()  # Creating instance of MyClass

Практические применения:

1. Singleton:

class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class Database(metaclass=Singleton):
    pass

2. Автоматическая регистрация:

class PluginMeta(type):
    plugins = []

    def __init__(cls, name, bases, namespace):
        super().__init__(name, bases, namespace)
        if name != 'Plugin':
            PluginMeta.plugins.append(cls)

3. Валидация атрибутов:

class ValidateMeta(type):
    def __new__(mcs, name, bases, namespace):
        for key, value in namespace.items():
            if not key.startswith('_') and callable(value):
                if not value.__doc__:
                    raise ValueError(f"Method {key} needs docstring")
        return super().__new__(mcs, name, bases, namespace)

Альтернативы:

  • Декораторы классов (проще)
  • __init_subclass__ (Python 3.6+)

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы