【问题标题】:Why does the != operator not call my '__neq__' method?为什么 != 运算符不调用我的 '__neq__' 方法?
【发布时间】:2018-04-24 12:08:51
【问题描述】:

我试图实现一些通配符类,它与任何字符串比较相等,但对其他任何字符串都是假的。但是,!= 运算符似乎没有按预期调用我的__neq__ 成员:

class A(str):
    def __cmp__(self, o):
        return 0 if isinstance(o, str) else -1

    def __eq__(self, o):
        return self.__cmp__(o) == 0

    def __neq__(self, o):
        return self.__cmp__(o) != 0

a = A()
b = 'a'
print(a == b) # Prints True, as expected
print(a != b) # Prints True, should print False

我做错了什么?

【问题讨论】:

  • 这是一个错字问题...
  • @Jean-FrançoisFabre:这是一个有趣的错字。这是熟悉 Windows 批处理文件的人会在其中将!= 拼写为NEQ 的那种错字。或者这是将__ne____eq__ 混合会犯的记忆错误。所以错误更多的是头脑而不是手指。我同意关闭它,但不幸的是人们的反对票。这是一个结构良好的问题。
  • 我已投票决定重新开放。答案就够了,但我不希望现在看到这个问题被关闭或删除,我找到了很多关于 __neq__ 错误的答案
  • 虽然没有研究,但值得一票否决。 docs.python.org/3/reference/datamodel.html#object.__ne__
  • How much research effort is expected of Stack Overflow users? 答案,“很多。一个荒谬的数量。超过你认为你的能力。在你到达你的绳索的尽头和没有的痛苦之后答案超过了发布您的问题所带来的大量羞耻感,那时您可以继续提问。因为到那时,您将完成任何必要的研究,使其成为一个值得提出的好问题!”跨度>

标签: python methods comparison-operators


【解决方案1】:

要覆盖!=,您需要定义__ne__,但您定义了__neq__

所以你必须改变

def __neq__(self, o):

def __ne__(self, o):

【讨论】:

  • 谢谢!这是一个愚蠢的错误,但我永远不会抓住它!
猜你喜欢
  • 2014-08-20
  • 2016-10-30
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2020-07-13
  • 2014-12-07
  • 2014-11-13
相关资源
最近更新 更多