重写Python的“ in”运算符?


197

如果要在Python中创建自己的类,则应定义什么函数,以便允许使用“ in”运算符,例如

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

我实际上正在搜索如何覆盖isand is not运算符。像一个query = tinydb.Query().field == value,也能写Query().field is not None。但似乎我留下__eq____ne__暂时,这导致了unpythonic Query().field != None。(sarc)
Tomasz

Answers:



191

一个更完整的答案是:

class MyClass(object):

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

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

在这里,当问54是否在m中时,您将得到True:

>>> m = MyClass()
>>> 54 in m
True  

请参阅有关重载的文档__contains__


@pthulin,您的代码可能更“完整”,但是Ignacio到文档的链接对某些人来说总是一个很大的好处。
彼得·汉森

16
@PEter。是的,但是我们当中有些人更喜欢直观,直观地表示答案。除了直接将我们引到这里而不是Google之前,Ignacio对该问题没有做任何贡献,谢谢。
Zoran Pavlovic

佐兰,我同意,我什至赞成这个答案,而不是其他。我只是指出,一个真正好的答案应该始终链接到文档(如果有)。
彼得·汉森

13
所有链接都死了,这就是为什么Ignacio的回答如此不稳定。链接+示例是最好的,这就是为什么我们正在讨论的两个答案相结合是最好的。
demongolem 2012年

1
@demongolem官方Python文档将在解释器无法下载时或之后消失。这不是一个仅链接的答案。我来到此页面寻找答案,却没有单击任何其他链接就找到了答案(即原型就足够了)。我原则上同意,但是恕我直言在这里不适用。
wizzwizz4

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.