元类中的额外参数
我写了一个元类:
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
参数里,因为我只需要在元类的层面使用它。
1 个回答
2
你需要写一个 __init__
方法,还有一个 __new__
方法。否则,Python 会调用 type.__init__
来初始化你的新类,而这个方法不接受任何额外的参数。
比如:
class FieldHandlerBase(type):
def __init__(cls, name, bases, attrs, model):
type.__init__(cls, name, bases, attrs)
cls.model = model
def __new__(metacls, name, bases, attrs, model):
...
return type.__new__(metacls, name, bases, attrs)
class ExampleFieldHandler(FieldHandler, metaclass=FieldHandlerBase,
model="Example"):
clsvar = "var"
# or
ExampleFieldHandler = FieldHandlerBase(
"ExampleFieldHandler",
(FieldHandler,),
{"clsvar": "var"},
model="Example"
)
assert ExampleFieldHandler.model == "Example"