在您将此标记重复之前,我已阅读this question和this 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
那么,我该如何正确地做到这一点并让它发挥作用? (我认为我的意图从课堂的非工作定义中可以清楚地看出。)