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 — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно