子类化元组时超级给出错误的类型()

时间:2017-03-19 16:28:41

标签: python inheritance tuples super

我尝试将某些东西从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 parametersT.__mro__,因此这本质上令人困惑。在没有明确说明类型和实例的情况下使用(__main__.T, tuple, object)时会发生相同的情况。

出了什么问题?

1 个答案:

答案 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