为什么python中有一个不相等的运算符

时间:2015-06-11 17:24:52

标签: python python-3.x operator-overloading

我想知道在SELECT tref_log_metrics_weights_and_factors.metric_title, DCount("[metric_weight]","tref_log_metrics_weights_and_factors","[metric_weight]<>0") AS metric_count, Dsum("[metric_weight]","tref_log_metrics_weights_and_factors") AS metric_sum, (([metric_count]*[tref_log_metrics_weights_and_factors].[metric_weight])/[metric_sum]) AS metric_N FROM tref_log_metrics_weights_and_factors 中有一个不相等的运算符的原因。

以下剪辑:

python

输出:

class Foo:
    def __eq__(self, other):
        print('Equal called')
        return True

    def __ne__(self, other):
        print('Not equal called')
        return True

if __name__ == '__main__':
    a = Foo()

    print(a == 1)
    print(a != 1)
    print(not a == 1)

这实际上不会引起很多麻烦:

Equal called
True
Not equal called
True
Equal called
False

可以同时正确。此外,这在忘记实施A == B and A != B 时会引入潜在的陷阱。

3 个答案:

答案 0 :(得分:7)

根据一个人的需要,有些情况是平等和不平等不相反;但是,绝大多数情况都是相反的,所以在Python 3中如果你没有指定__ne__方法,Python会为你反转__eq__方法。

如果您要编写的代码可以在Python 2和Python 3上运行,那么您应该同时定义它们。

答案 1 :(得分:1)

根据data model documentation,它涵盖&#34;魔术方法&#34; ,您可以在课程上实施(强调我的):

  

比较运营商之间没有隐含的关系。的的   x==y的真实性并不意味着x!=y是错误的。因此,何时   定义__eq__(),还应定义__ne__()以便{。}}   运营商将按预期行事。

答案 2 :(得分:-2)

似乎您要返回True而不是进行比较。