0

我创建了一个具有类型的类,因为我需要使用一个变量作为基础。如果我不提供__init__方法,它可以正常工作,但是当我提供方法时,我无法调用 base 的__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 ?

谢谢。

4

1 回答 1

1

我很惊讶您的type电话正常工作;bases应该是一个元组 ( (api.aclass,))。这只是一个错字吗?

super()在 (2) 中的调用将不起作用,因为它在类声明之外;Python 3super的魔法相当复杂,说实话有点脆弱。你可以写super(mc, self).__init__(*args, **kwargs)

但是,您没有理由不在这里使用正确的类声明(尤其是如果您不了解如何使用 3-argument type);Python 完全可以使用变量基声明类:

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
于 2012-07-05T08:55:26.170 回答