← Назад к вопросам

Какая встроенная функция используется для создания метакласса?

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 используют метаклассы для валидации и трансформации классов
Какая встроенная функция используется для создания метакласса? | PrepBro