如何覆盖python的“不在”运算符

时间:2019-11-02 22:28:04

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

我意识到__contains__是“ in”运算符。我还意识到,默认情况下,“ not in”是对__contains__的否定。但是,许多python文档都列出了“ not in”,好像它是与“ in”分开的运算符。 __contains____eq____ne__中有两个运算符,一个通常是另一个的否定?如果是这样,正确使用双下划线__<name>__是什么?

def __init__(self):
    self.numbers = [1,2,3,4,54]

def __contains__(self, key):
    return key in self.numbers

1 个答案:

答案 0 :(得分:4)

没有单独的“不包含”挂钩。 innot in不能分别覆盖。

存在单独的__eq____ne__钩子,因为==!=可能不返回布尔值。例如,不能将NumPy数组的!=实现为not (x == y)not in没有这个问题,因为innot in都必须返回布尔值。

如果您查看data model documentation,将会发现它仅记录了__contains__in的单个not in钩子。您还可以查看implementation,其中innot in调用相同的PySequence_Contains C API函数,然后not in应用{{1} }转换为结果:

!