Я написал следующий метакласс:Дополнительные аргументы в метаклассе
class FieldHandlerBase(type):
def __new__(cls, name, bases, dct, model):
...
return super(FieldHandlerBase, cls).__new__(cls, name, bases, dct)
Теперь я пытаюсь динамически создать класс, используя вышеупомянутый метакласс:
FieldHandlerBase(
'%sFieldHandler' % name,
(FieldHandler,),
{rel_type: dct.setdefault(rel_type,()) for rel_type in REL_TYPES},
model=name)
Но он бросает мне эту ошибку:
> model=name)
E TypeError: Error when calling the metaclass bases
E type.__init__() takes no keyword arguments
Я не понимаю, почему, поскольку я называю базой метакласса (type
здесь, с в FieldHandlerBase
) с правильным количеством аргументов. Как я могу это исправить? Мне нужно передать дополнительный аргумент FieldHandlerBase
, и я не хочу включать его в аргумент dct
, так как он мне нужен только на уровне метакласса.
О, я думал, что '__init __()' будет вызываться с теми же аргументами, что и '__new __()'. Спасибо! – linkyndy
Это так. И в этом проблема. Поскольку вы не определили свой собственный '__init__', вызывается' __init__' на суперкласс (тип). Тип '__init__' type не принимает модель в качестве параметра, и поэтому вызов завершается с ошибкой. – Dunes
Я имел в виду второй вызов '__new __()', тот, который я делаю для суперкласса ('type'), и где я точно не принимаю аргумент' model'. Но если я правильно понимаю, вызовы '__new __()' и '__init __()' отправляются из другого места, и оба они имеют одинаковые аргументы, независимо от того, что я делаю в этих двух методах. Теперь, из любопытства, кто точно отправляет вызовы на '__new __()' и '__init __()'? – linkyndy