我尝试将某些东西从python2移植到python3,并遇到了关于以下类的错误:
class Bound(tuple):
# some methods skipped…
def __new__(cls, value, is_closed):
if value is NegativeInfinity or value is PositiveInfinity:
is_closed = False
return tuple.__new__(cls, (value, is_closed))
def __init__(self, value, is_closed):
"""
See __new__
"""
super(Bound, self).__init__((value, is_closed))
尝试初始化时,object.__init__() takes no parameters
会失败。似乎super(Bound, self).__init__(…)
访问了__init__
的{{1}}方法,这似乎是错误的 - 不object
只是在对象super
上前进?
为了缩小范围,我写了以下结构:
__mro__
在此示例中,我收到了同样的错误:class T(tuple):
def __new__(cls, arg):
return super(T, cls).__new__(cls, arg)
def __init__(self, arg):
return super(T, self).__init__(arg)
告诉我T([])
。
由于object.__init__() takes no parameters
为T.__mro__
,因此这本质上令人困惑。在没有明确说明类型和实例的情况下使用(__main__.T, tuple, object)
时会发生相同的情况。
出了什么问题?
答案 0 :(得分:4)
似乎
super(Bound, self).__init__(…)
访问了__init__
的{{1}}方法,这似乎是错误的 - 不会object
只是前进到对象super
?
__mro__
是MRO中的下一个object.__init__
,因为__init__
没有自己的tuple
。
在Python 2上,这会给你一个(默认情况下被禁止)警告。在Python 3上,它是一个错误。您可以删除__init__
方法(由于__init__
中的特殊处理,会阻止object.__init__
投诉),或者您可以在不带参数的情况下调用object.__init__
。< / p>
有关更多详细信息,请参阅Python源代码中的explanatory comment。