Python 一个只有'__获取项目';方法定义支持';在';操作人员

Python 一个只有'__获取项目';方法定义支持';在';操作人员,python,operator-overloading,python-collections,Python,Operator Overloading,Python Collections,如果我有以下定义: Card = namedtuple('Card', ['rank', 'suit']) class CardDeck(): ranks = [str(x) for x in range(2, 11)] + list('JQKA') suits = 'spades diamonds clubs hearts'.split() def __init__(self): self._cards = [Card(rank, suit) for rank in s

如果我有以下定义:

Card = namedtuple('Card', ['rank', 'suit'])

class CardDeck():
  ranks = [str(x) for x in range(2, 11)] + list('JQKA')
  suits = 'spades diamonds clubs hearts'.split()

  def __init__(self):
    self._cards = [Card(rank, suit) for rank in self.ranks for suit in self.suits]

  def __getitem__(self, index):
    return self._cards[index]
如何在不定义
\uuu contains\uuu
dunder方法的情况下支持
in
运算符。例如:

deck = CardDeck()
print(Card('2', 'hearts') in deck)
将输出:

True
有什么想法吗?

来自


。请参阅参考文档中的表达式:

最后,尝试了旧式的迭代协议:如果类定义了
\uu getitem\uuu()
y中的x
True
,当且仅当存在一个非负整数索引i,使得
x为y[i]或x==y[i]
,并且没有较低的整数索引引发
索引器
异常

实际上,Python只是使用了一个递增的索引,在Python中,这个索引看起来像这样:

from itertools import count

def contains_via_getitem(container, value):
    for i in count():   # increments indefinitely
        try:
            item = container[i]
            if value is item or value == item:
                return True
        except IndexError:
            return False
这种处理方法扩展到所有迭代功能。未实现
\uuu iter\uuu
但实现
\uuu getitem\uuu
的容器仍然可以为其创建迭代器(使用
iter()
或C-API等效工具):

print('something')
放在
\uuu getitem\uuuu
哦,太好了,这正是文档中与此相关的部分。
from itertools import count

def contains_via_getitem(container, value):
    for i in count():   # increments indefinitely
        try:
            item = container[i]
            if value is item or value == item:
                return True
        except IndexError:
            return False
>>> class Container:
...     def __init__(self):
...         self._items = ["foo", "bar", "baz"]
...     def __getitem__(self, index):
...         return self._items[index]
...
>>> c = Container()
>>> iter(c)
<iterator object at 0x1101596a0>
>>> list(iter(c))
['foo', 'bar', 'baz']
def __contains__(self, item):
    # a card deck contains all possible cards
    return isinstance(item, Card)