【问题标题】:Override Python's 'in' operator?覆盖 Python 的“in”运算符?
【发布时间】:2011-01-14 02:11:53
【问题描述】:

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

class MyClass(object):
    ...

m = MyClass()

if 54 in m:
    ...

【问题讨论】:

  • 我实际上是在搜索如何覆盖 isis not 运算符。喜欢query = tinydb.Query().field == value,也可以写Query().field is not None。但似乎我暂时只剩下__eq____ne__,这导致了unpythonic Query().field != None。 (sarc)

标签: python operator-overloading operators in-operator


【解决方案1】:

更完整的答案是:

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  

documentation on overloading __contains__

【讨论】:

  • @pthulin,您的代码可能“更完整”,但 Ignacio 的文档链接对某些人来说总是一大优势。
  • @PEter。是的,但我们中的一些人更喜欢答案的漂亮、直观的表示。伊格纳西奥除了先把我们引到这里而不是谷歌之外,对这个问题几乎没有什么好处,不,谢谢。
  • Zoran,我同意,我什至赞成这个答案,而不是另一个。我只是指出一个真正好的答案应该总是链接到文档,如果有的话。
  • 所有,链接都死了,这就是为什么 Ignacio 的答案在 SO 上不稳定的原因。链接 + 示例是最好的,这就是为什么我们正在谈论的两个答案的组合是最好的。
  • @demongolem 官方 Python 文档将在解释器无法下载时或之后消失。而且它不是仅链接的答案;我来到这个页面寻找答案并找到它而没有点击任何进一步的链接(即原型就足够了)。我原则上同意,但恕我直言,这不适用于这里。
【解决方案2】:
【解决方案3】:

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

http://code.activestate.com/recipes/384122/

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多