重写Python';s';在';操作人员

重写Python';s';在';操作人员,python,operator-overloading,operators,in-operator,Python,Operator Overloading,Operators,In Operator,如果我用Python创建自己的类,我应该定义什么函数以允许使用'in'操作符,例如 class MyClass(object): ... m = MyClass() if 54 in m: ... 更完整的答案是: class MyClass(object): def __init__(self): self.numbers = [1,2,3,4,54] def __contains__(self, key): retur

如果我用Python创建自己的类,我应该定义什么函数以允许使用'in'操作符,例如

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

更完整的答案是:

class MyClass(object):

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

    def __contains__(self, key):
        return key in self.numbers
在这里,当您询问54是否为m时,您会得到正确答案:

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

请参阅。

您可能还想看看我能够用来创建特定于域的语言的中缀运算符覆盖框架:


@pthulin,您的代码可能“更完整”,但Ignacio指向文档的链接对某些人来说总是一个很大的好处。@PEter。是的,但是我们中的一些人更喜欢一个漂亮的,直观的答案。伊格纳西奥对这个问题没有什么好处,只是先把我们引向这里,而不是谷歌,不,谢谢。佐兰,我同意,我甚至对这个答案投了更高的票,而不是另一个。我只是指出,一个真正好的答案应该总是链接到文档,如果有的话。所有的链接都会消失,这就是为什么Ignacio的答案如此不确定的原因。Links+example是最好的,这就是为什么我们正在讨论的两个答案的组合是最好的。@demongolem官方Python文档将随着解释器的出现或在解释器变得不可下载后消失。这不是一个链接唯一的答案;我来到这个页面寻找答案,发现它没有点击任何进一步的链接(即原型是足够的)。我原则上同意,但我认为这不适用于这里。我实际上在搜索如何覆盖
is
is not
运算符。像
query=tinydb.query().field==value
,也可以写入
query()。field不是None
。但是现在我似乎只剩下
\uu eq\uuu
\uu ne\uuu
,这导致了非音速
查询()字段!=无
。(sarc)