Python 数据模型:覆盖特殊方法 "contains"

Python Data Model : Overriding special method "contains"

所以我试图通过 "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)

运行 上面的代码给了我以下结果,而我希望它说 "Contains has been overridden"

True

为什么我不能覆盖包含?

我认为你的情况是多种因素的结合:

因此,由于您 return 编辑了一个非空字符串,因此它被评估为 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)

但是不要像您在这里所做的那样试图从根本上改变魔术方法的含义。它会混淆其他人(包括你未来的自己)