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 ......抛出标题中提到的错误。
知道为什么。
答案 0 :(得分:1)
super
不是静态定义的类的超类的替代品。有两个问题:
如果object.__new__
确实是MRO中的下一个方法,则您无法传递其他参数,因为object.__new__
不接受它们。
如果MRO中有下一个其他类C
,而C.__new__
希望有其他参数,则必须供应它们。
super
时,必须将类层次结构视为一个整体,尤其是如果您使用的方法可能由object
执行。在这种情况下,您必须确保有一个基类可以接受__new__
,和的其他参数,保证object
成为其中的下一个类MRO,以便它可以在没有额外参数的情况下调用__new__
。
如果您只是使用super
来避免撰写object.__new__(cls)
,那么您错误地使用了super
。