Итак, я немного читаю о метаклассах в Python и как type() three-argument alter-ego используется для динамического создания классов. Однако третий аргумент обычно представляет собой dict, который инициализирует переменную класса __dict__, которая должна быть создана.
Если я хочу динамически создавать классы на основе метакласса, который использует __slots__ вместо __dict__, как я могу это сделать? Является ли type() еще каким-то образом использованным наряду с переопределением __new__()?
Как FYI, я знаю о правильном использовании для __slots__, чтобы сохранить память при создании большого числа классов против злоупотребления ею для обеспечения формы безопасности типов.
Пример нормального (нового стиля) класса, который устанавливает __metaclass__ и использует __dict__:
class Meta(type):
def __new__(cls, name, bases, dctn):
# Do something unique ...
return type.__new__(cls, name, bases, dctn)
class Foo(object):
__metaclass__ = Meta
def __init__(self):
pass
В приведенном выше примере вызывается type.__new__(), а четвертый аргумент (который становится третьим при фактическом использовании) создает __dict__ в Foo. Но если бы я хотел изменить Meta, чтобы включить __slots__, то у меня нет словаря для перехода к функции type() __new__() (насколько мне известно - я еще не тестировал это, просто размышляя и пытаясь найти какой-то сценарий использования).
Изменить: Быстрое, но непроверенное предположение состоит в том, чтобы взять значение значений, которые нужно поместить в переменные __slots__, и передать его в type.__new__(). Затем добавьте __init__() в Meta, который заполняет переменные __slots__ из dict. Хотя я не уверен, как этот dict достигнет __init__(), потому что объявление __slots__ предотвращает создание __dict__, если __dict__ не определено в __slots__...