【问题标题】:Why is it possible to override both __eq__ and __ne__ in classes?为什么可以在类中同时覆盖 __eq__ 和 __ne__ ?
【发布时间】:2018-05-27 03:46:11
【问题描述】:

Python 提供了重载== 运算符和!= 运算符的特性。但为什么?重载==!= 是否会自动与== 相反(实际值)?

一个结果不应该自动暗示另一个吗?

【问题讨论】:

  • 说你有x = 1y = 2if x == 1 and x != 2确实没用,但是检查if x == 1 and x != y是另一回事,如果有x = y的可能性。跨度>
  • 想象一下数据库的 ORM 中的过滤器。两个运算符都重载时,可以为它们生成不同的 SQL。
  • 注意:这不是一个的问题。稍微改写一下,这是一个很好的问题,突出了 python 的一个特定设计特性。

标签: python python-3.x class


【解决方案1】:

你没有去,python没有强迫你去。事实上,documentation 解释了原因和原因:

默认情况下,__ne__() 委托给__eq__() 并反转结果 除非是NotImplemented。没有其他隐含关系 在比较运算符中,例如(x<yx==y)的真值并不意味着x<=y

一般来说,x==y 的真值不必暗示x!=y 是假的。如果您的数据模型需要反映这种关系,python 可以让您轻松做到这一点。

请注意,对于早期版本的 python,甚至没有暗示这种关系。例如,

class Foo:
    def __init__(self, val):
        self.val = val

    def __eq__(self, other):
        return self.val == other.val

f1, f2 = Foo(1), Foo(1)

现在,f1 == f2 在任何版本上都会返回 True。但是,f1 != f2 在 python-3.x 上返回 False,但在 python-2.x 上返回 True(因为 __ne__ 在 python-2.x 上没有隐含,并且通常两个用户定义的对象不是如果它们的 ID 不相同,即不是同一个对象,则相等)。

【讨论】:

  • 谢谢。我什至没有检查文档。我的错。谢谢。
  • In general, the truth of x==y does not have need to imply that x!=y is false.你能举个例子什么时候这样的模型可能有用吗?
  • @Truth-seek 我可能不是回答这个问题的最佳人选,但请看一下 Klaus D 的 comment
猜你喜欢
  • 2014-08-18
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2019-03-03
  • 1970-01-01
  • 2011-03-28
  • 2011-05-20
相关资源
最近更新 更多