无法在使用type()创建的类中调用base __init__

时间:2012-07-05 07:41:54

标签: python-3.x metaclass

我创建了一个类型的类,因为我需要为基础使用变量。 如果我不提供__init__方法,它可以正常工作,但当我提供方法时,我无法调用基数__init__

使用:

def constructor():
    blah blah
    api = importlib.import_module(xtype)
    mc = type('mc', (api.aclass,), {})
    obj = mv(**args)
    return obj

不起作用,返回“SystemError: super(): __class__ cell not found

def constructor():
    blah blah
    api = importlib.import_module(xtype)
    mc = type('mc', (api.aclass,), dict(__init__ = mc__init)
    obj = mc(**args)
    return obj

def mc_init(*args, **kwargs):
    do_some_stuff
    super().__init__(*args, **kwargs)

不起作用,稍后在创建对象时返回“Base mc.__init__ not called.”:

def constructor():
    global api
    blah blah
    api = importlib.import_module(xtype)
    mc = type('mc', (api.aclass,), dict(__init__ = mc__init)
    obj = mc(**args)
    return obj

def mc_init(*args, **kwargs):
    global api
    do_some_stuff
    api.aclass.__init__(*args, **kwargs)

x = constructor()

如何为基类调用 init

感谢。

1 个答案:

答案 0 :(得分:1)

我很惊讶你的type电话有效; bases应该是一个元组((api.aclass,))。这只是一个错字吗?

您在{2}中的super()电话不会在课堂声明之外发挥作用; Python 3 super魔术相当复杂,说实话有点脆弱。你可以写super(mc, self).__init__(*args, **kwargs)

但是,你没有理由不在这里使用正确的类声明(特别是如果你不理解如何使用3参数type);使用变量base声明类是完全正常的:

def constructor():
    ...
    api = importlib.import_module(xtype)
    class mc(api.aclass):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
    obj = mc(**args)
    return obj