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)