使用多个`__init__`参数对`frozenset`进行子类化,以及`__new__`的奇怪行为

时间:2017-08-16 18:16:13

标签: python-3.x class inheritance constructor

在您将此标记重复之前,我已阅读this questionthis question并且他们不回答我的问题(甚至似乎让我更加困惑,更不用说他们了&#39 ;在Python 2中我都想知道Python 3)。从this question开始,了解以下代码的原因,

from typing import Hashable


class UnorderedPair(frozenset):
    def __init__(self, left: Hashable, right: Hashable):
        self.left = left
        self.right = right
        super().__init__((left, right))
        if len(self) != 2:
            raise TypeError("There must be 2 distinct elements. Possible duplicate in {{{}, {}}}.".format(left, right))

    def __str__(self):
        return "{{left: {}, right: {}}}".format(self.left, self.right)


if __name__ == '__main__':
    p = UnorderedPair(1, 2)
    print(p)

产生以下错误。

TypeError: UnorderedPair expected at most 1 arguments, got 2

这是因为我需要覆盖__new__()以及__init__()。然而,这是让我感到困惑的地方。根据{{​​3}}的答案,看起来我应该覆盖__new__(),如下所示。

from typing import Hashable


class UnorderedPair(frozenset):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls, *args, **kwargs)

    def __init__(self, left: Hashable, right: Hashable):
        self.left = left
        self.right = right
        super().__init__((left, right))
        if len(self) != 2:
            raise TypeError("There must be 2 distinct elements. Possible duplicate in {{{}, {}}}.".format(left, right))

    def __str__(self):
        return "{{left: {}, right: {}}}".format(self.left, self.right)


if __name__ == '__main__':
    p = UnorderedPair(1, 2)
    print(p)

但这给了我同样的错误。所以也许我应该如下覆盖它(一些代码被省略,因为它和以前一样)。

def __new__(cls, left: Hashable, right: Hashable):
    return super().__new__(cls, (left, right))

但是这给出了以下非常神秘的错误。

    super().__init__((left, right))
TypeError: object.__init__() takes no parameters

它与object.__init__()有什么关系!?!?!?无论如何,或许我应该覆盖如下。

def __new__(cls, left: Hashable, right: Hashable):
    return super().__new__(cls)

但这仍然会产生同样的错误。

    super().__init__((left, right))
TypeError: object.__init__() takes no parameters

那么,我该如何正确地做到这一点并让它发挥作用? (我认为我的意图从课堂的非工作定义中可以清楚地看出。)

0 个答案:

没有答案