class Works(type):
def __new__(cls, *args, **kwargs):
print([cls,args]) # outputs [<class '__main__.Works'>, ()]
return super().__new__(cls, args)
class DoesNotWork(type):
def __new__(*args, **kwargs):
print([args[0],args[:0]]) # outputs [<class '__main__.doesNotWork'>, ()]
return super().__new__(args[0], args[:0])
Works() # is fine
DoesNotWork() # gets "RuntimeError: super(): no arguments"
据我所知,在两种情况下,super._new__都接收类文字作为第一个参数,一个空元组作为第二个参数。
那么为什么一个人会出错而另一个没有?
答案 0 :(得分:14)
super
的零参数形式要求包含它的方法具有显式(即非varargs)第一个参数。这由an older version of the docs建议(强调补充):
零参数表单自动在堆栈帧中搜索类(
__class__
)和第一个参数。
出于某种原因,此说明已在更高版本的文档中删除。 (可能值得提出一个doc bug,因为关于零参数super
如何工作以及它需要什么工作的文档非常模糊。)
另请参阅this Python bug report(未解决,即使是错误也未明确接受)。结果是零参数super
是神奇的,并且在某些情况下魔法失败了。正如错误报告中所建议的那样,如果您只想接受varargs,则需要使用super
的显式双参数形式。