← Назад к вопросам
Какая встроенная функция используется для создания метакласса?
2.0 Middle🔥 151 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Функция type() для создания метакласса
В Python для создания метакласса используется встроенная функция type(). Эта функция одновременно является встроенным типом Python и инструментом для динамического создания классов, включая метаклассы.
Как type() работает с метаклассами
type() имеет две различные функции в зависимости от количества аргументов:
# 1. Когда вызывается с одним аргументом — возвращает тип объекта
print(type(42)) # <class 'int'>
print(type([1, 2, 3])) # <class 'list'>
# 2. Когда вызывается с тремя аргументами — создаёт новый класс
# Синтаксис: type(name, bases, attrs)
Создание класса динамически через type()
# Обычный способ определения класса
class Dog:
species = "Canis familiaris"
def __init__(self, name):
self.name = name
def bark(self):
return f"{self.name} says Woof!"
# Эквивалентно создание через type()
Dog = type(
'Dog', # Имя класса
(), # Кортеж базовых классов (пусто = наследуется от object)
{
'species': "Canis familiaris",
'bark': lambda self: f"{self.name} says Woof!"
}
)
dog = Dog()
print(dog.species) # Canis familiaris
Создание метакласса через type()
Метакласс — это класс класса, его мать. Для создания метакласса передаём type (или его потомка) как третий параметр или используем параметр metaclass:
# Способ 1: Наследование от type через type()
class Meta(type):
def __new__(mcs, name, bases, attrs):
print(f"Создан класс {name}")
attrs['created_by'] = 'Meta'
return super().__new__(mcs, name, bases, attrs)
# Способ 2: Использование класса как метакласса
MyClass = type('MyClass', (), {}, metaclass=Meta)
# Выведет: Создан класс MyClass
# Способ 3: Явное наследование
class MyClass(metaclass=Meta):
pass
# Выведет: Создан класс MyClass
Практический пример: Автоматическая валидация атрибутов
class ValidatingMeta(type):
def __new__(mcs, name, bases, attrs):
annotations = attrs.get('__annotations__', {})
for attr_name, attr_type in annotations.items():
print(f"Класс {name}: атрибут '{attr_name}' должен быть типа {attr_type}")
return super().__new__(mcs, name, bases, attrs)
class Person(metaclass=ValidatingMeta):
name: str
age: int
Проверка, является ли объект метаклассом
class MyMeta(type):
pass
class MyClass(metaclass=MyMeta):
pass
print(isinstance(MyClass, type)) # True
print(isinstance(MyClass, MyMeta)) # True
print(type(MyClass)) # <class '__main__.MyMeta'>
Практическое применение: Singleton
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in SingletonMeta._instances:
SingletonMeta._instances[cls] = super().__call__(*args, **kwargs)
return SingletonMeta._instances[cls]
class Database(metaclass=SingletonMeta):
def __init__(self):
self.connection = "Connected"
db1 = Database()
db2 = Database()
print(db1 is db2) # True
Важные особенности
typeвстроен в Python — не нужен импорт- Метаклассы наследуют от
type— черезclass MyMeta(type): - Иерархия: объект → класс (тип) → метакласс (type)
- Порядок вызова:
__new__→__init__→__call__ - Использование: Django ORM, Pydantic, SQLAlchemy используют метаклассы для валидации и трансформации классов