获取" super():没有参数"一种情况下的错误,但不是类似的情况

时间:2016-09-04 00:35:54

标签: python super

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__都接收类文字作为第一个参数,一个空元组作为第二个参数。

那么为什么一个人会出错而另一个没有?

1 个答案:

答案 0 :(得分:14)

super的零参数形式要求包含它的方法具有显式(即非varargs)第一个参数。这由an older version of the docs建议(强调补充):

  

零参数表单自动在堆栈帧中搜索类(__class__和第一个参数

出于某种原因,此说明已在更高版本的文档中删除。 (可能值得提出一个doc bug,因为关于零参数super如何工作以及它需要什么工作的文档非常模糊。)

另请参阅this Python bug report(未解决,即使是错误也未明确接受)。结果是零参数super是神奇的,并且在某些情况下魔法失败了。正如错误报告中所建议的那样,如果您只想接受varargs,则需要使用super的显式双参数形式。