Итак, я немного читаю о метаклассах в 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__
...