【问题标题】:Cannot call base __init__ in a class created with type()无法在使用 type() 创建的类中调用 base __init__
【发布时间】:2012-07-05 07:41:54
【问题描述】:

我创建了一个具有类型的类,因为我需要使用一个变量作为基础。 如果我不提供 __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

谢谢。

【问题讨论】:

  • 我强烈建议您将满意的答案标记为“已接受”(绿色复选标记)。你问了7个问题,没有一个被接受;这是不寻常的。如果人们知道他们可以解决你的问题,你就会激励他们回答。

标签: python-3.x metaclass


【解决方案1】:

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

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

但是,您没有理由不在这里使用正确的类声明(尤其是如果您不了解如何使用 3 参数 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

【讨论】:

  • super(mc, self) 不起作用,它返回:`NameError: global name 'mc' is not defined',但我想我可以将其设为全局。我没有意识到您可以使用变量作为基础,这有效并解决了我的问题
猜你喜欢
  • 2016-10-03
  • 2017-11-11
  • 2012-07-23
  • 2014-03-07
  • 2011-10-27
  • 2017-10-19
  • 2021-07-21
  • 2011-11-06
  • 2017-12-13
相关资源
最近更新 更多