因此,我试图通过“ Fluent Python”一书更好地理解python。在python数据模型中,作者描述了如何为类定义特殊方法。
class FrenchDeck:
ranks = [str(n) for n 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 __len__(self):
return len(self._cards)
def __getitem__(self,position):
return self._cards[position]
def __contains__(self,*args):
return "Contains has been overridden"
deck = FrenchDeck()
print(Card('Q','hearts') in deck)
运行上面的代码给我以下结果,而我希望它说“包含已被覆盖”
是
我为什么不能覆盖包含的内容?
答案 0 :(得分:1)
我认为您的情况是多方面因素的结合:
因此,由于您返回了非空字符串,因此将其评估为True值。如果将其更改为空字符串,则值为False。这是一个示例:
import dataclasses
@dataclasses.dataclass
class Card:
rank: str
suit: str
class FrenchDeck:
ranks = [str(n) for n 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 __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
def __contains__(self, item):
return ""
deck = FrenchDeck()
print(Card('Q','hearts') in deck)
但是,不要像在此那样从根本上改变魔术方法的含义。它将使其他人(包括您未来的自我)迷惑