首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Metaclass中的额外参数

Metaclass中的额外参数
EN

Stack Overflow用户
提问于 2014-10-26 09:01:42
回答 1查看 809关注 0票数 1

我编写了以下元类:

代码语言:javascript
复制
class FieldHandlerBase(type):
    def __new__(cls, name, bases, dct, model):
        ...
        return super(FieldHandlerBase, cls).__new__(cls, name, bases, dct)

现在,我尝试使用上面的元类动态创建一个类:

代码语言:javascript
复制
FieldHandlerBase(
    '%sFieldHandler' % name,
    (FieldHandler,),
    {rel_type: dct.setdefault(rel_type, ()) for rel_type in REL_TYPES},
    model=name)

但它让我犯了这个错误:

代码语言:javascript
复制
>           model=name)
E       TypeError: Error when calling the metaclass bases
E           type.__init__() takes no keyword arguments

我不明白为什么,因为我用正确的参数数调用元类基(在这里是type,从FieldHandlerBase内部)。我怎么才能解决这个问题?我需要向FieldHandlerBase传递一个额外的参数,我不想将它包含到dct参数中,因为我只需要元类级别的参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-26 14:19:52

您需要编写__init__方法和__new__方法。否则,python将为您的新类调用type.__init__,该类不带任何附加参数。

例如:

代码语言:javascript
复制
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"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26571375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档