元类中的额外参数

1 投票
1 回答
1056 浏览
提问于 2025-04-29 17:36

我写了一个元类:

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"

撰写回答