python - 类定义 == 有效,但 != 无效
问题描述
让我们考虑以下最小示例:
class Dummy:
def __init__(self, v1, v2, v3):
self.v1 = v1
self.v2 = v2
self.v3 = v3
def __key(self):
return (self.v1, self.v2, self.v3)
def __hash__(self):
return hash(self.__key())
def __eq__(self, other):
""" == comparison method."""
return isinstance(self, type(other)) and self.__key() == other.__key()
def __ne__(self, other):
""" != comparison method."""
return not self.__eq__(self, other)
D1 = Dummy(1, 2, 3)
D2 = Dummy(1, 4, 5)
如果我尝试D1 == D2
,我会得到False
。但是,如果我尝试D1 != D2
,我会得到:
D1 != D2
Traceback (most recent call last):
File "<ipython-input-3-82e7c8b040e3>", line 1, in <module>
D1 != D2
File "<ipython-input-1-34c16f7f1c83>", line 19, in __ne__
return not self.__eq__(self, other)
TypeError: __eq__() takes 2 positional arguments but 3 were given
我一直__ne__()
用这种语法定义为not self.__eq__()
. 直到现在我从来没有遇到过任何问题,我无法弄清楚为什么它不起作用......
解决方案
def __ne__(self, other):
""" != comparison method."""
return not self.__eq__(self, other)
self
您不应该像不传递给self.__eq__
一样明确传递self
给self._key()
:
def __ne__(self, other):
""" != comparison method."""
return not self.__eq__(other)
推荐阅读
- html - 如何从引导程序的下拉菜单中删除边框?
- microsoft-graph-api - 在图形资源管理器中放置共享点文件时出现 403 错误
- php - 如何使管理员可以将特定类型的用户(学生)与 laravel 中的另一种类型的用户(他们各自的导师)匹配
- function - 在 F# 中调用函数后,如何在 F# 中重复函数?
- dart - 从 AngularDart 中的输入标签读取文件
- android - 调用 setVisibility 类时出错
- python - 基于行号列表合并数据框
- css - 使用整个 SVG 的 CSS 剪辑路径
- ios - 如何在 iTunes 连接中更改捆绑标识符
- python - 使 Ansible 使用非空 shell 环境