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"
Run Code Online (Sandbox Code Playgroud)
据我所知,在两种情况下,super._new__都接收类文字作为第一个参数,一个空元组作为第二个参数.
那么为什么会出错而另一个不出错?
Bre*_*arn 16
零参数形式super要求包含它的方法具有显式(即非varargs)第一个参数.这是由较旧版本的文档(强调添加)建议的:
零参数表单自动在堆栈帧中搜索class(
__class__)和第一个参数.
出于某种原因,在以后的文档版本中删除了此注释.(可能值得提出一个doc bug,因为文档对零参数如何super工作以及它工作所需的内容非常模糊.)
另请参阅此Python错误报告(未解决,即使是错误也未明确接受).结果是零参数super是魔术,并且在某些情况下魔法失败.正如错误报告中所建议的那样,如果你只想接受varargs,你需要使用显式的双参数形式super.