Python3 None.__eq__("a")值为True的情况

Python 3中,None.__eq__('a') 表达式的返回值应该是 False,因为 None 不等于 'a'。如发现这个表达式返回 True,这可能是因为 None.__eq__ 方法被重载或篡改了。本文主要介绍Python3中类的__eq__使用的特殊情况,None.__eq__('a')值应为NotImplemented,有些情况进行比较值为True。

1、__eq__方法返回NotImplemented的情况

None.__eq__('a')

通过None直接调用__eq__方法返回的是NotImplemented(1).__eq__('a')'a'.__eq__(1)也返回NotImplemented

2、示例代码 

class A:
    def __eq__(self, other):
        print('A.__eq__')
        return NotImplemented
class B:
    def __eq__(self, other):
        print('B.__eq__')
        return NotImplemented
class C:
    def __eq__(self, other):
        print('C.__eq__')
        return True
a = A()
b = B()
c = C()
print(a == b)
# A.__eq__
# B.__eq__
# False
print(a == c)
# A.__eq__
# C.__eq__
# True
print(c == a)
# C.__eq__
# True

3、结论

None.__eq__("a")等于True的情况,由于None.__eq__("a")返回NotImplemented
bool(NotImplemented)True,所以bool(None.__eq__("a"))就等于True。这种bool(NotImplemented)的特殊情况,值得注意一下。

推荐阅读
cjavapy编程之路首页