我编写了以下元类:
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参数中,因为我只需要元类级别的参数。
发布于 2014-10-26 14:19:52
您需要编写__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"https://stackoverflow.com/questions/26571375
复制相似问题