object .__ new __()不带参数

时间:2016-01-20 14:18:00

标签: python python-3.x typeerror

class SingletonLoader(object):
    cachedStates = {}

    def __new__(cls, key, loadFunc):
        print "SingletonLoader.new: cls = %s, key = %s, loadFunc = %s" % (cls, key, loadFunc)

        if key not in cls.cachedStates:
            plugin.msg("New key %s, invoking loader function %s" % (key, loadFunc))
            cls.cachedStates[key] = loadFunc()
            plugin.msg("Cached %s under key %s" % (key, cls.cachedStates[key]))

        return super(SingletonLoader, cls).__new__(cls, key, loadFunc)


    def __init__(self, key, loadFunc):
        # Set members from the cached state matching the key.
        self.__dict__ = self.__class__.cachedStates[key]

行返回超级(SingletonLoad ......抛出标题中提到的错误。

知道为什么。

1 个答案:

答案 0 :(得分:1)

super不是静态定义的类的超类的替代品。有两个问题:

  1. 如果object.__new__确实是MRO中的下一个方法,则您无法传递其他参数,因为object.__new__不接受它们。

  2. 如果MRO中有下一个其他类C,而C.__new__ 希望有其他参数,则必须供应它们。

  3. 抓住了22,不是吗?解决方案是,在使用super时,必须将类层次结构视为一个整体,尤其是如果您使用的方法可能由object执行。在这种情况下,您必须确保有一个基类可以接受__new__的其他参数,保证object成为其中的下一个类MRO,以便它可以在没有额外参数的情况下调用__new__

    如果您只是使用super来避免撰写object.__new__(cls),那么您错误地使用了super