【发布时间】:2017-01-11 18:13:48
【问题描述】:
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__ 都将类文字作为第一个参数,并将一个空元组作为第二个参数。
那么为什么一个给出错误而另一个没有呢?
【问题讨论】:
-
你没有在你的
__new__中使用clsDoesNotWork...(另外——你真的应该在super()中使用*args以保持签名正确。 .. -
我没有在
DoesNotWork中明确地给__new__一个具体的第一个参数,但是传递的参数super()是相同的,所以我不明白这个错误。使用 *args 会给我TypeError: type() takes 1 or 3 arguments错误,尽管那是一个单独的问题。 -
你使用
__new__而不是__init__有什么特别的原因 - 看起来你真的想使用后者...... -
没有理由,我只是想知道为什么我在一种情况下得到错误而不是另一种情况。
-
在其他形式中(在非类方法中),
super(cls)与super(cls, the_first_argument_passed_to_this_function)相同。我怀疑这里发生了类似的事情 -super()试图默认为super(first_argument_passed_to_this_function),但*args和**kwargs不算作参数(因为它们是特殊情况),所以它失败了。