Python数据模型:覆盖特殊方法“包含”

时间:2020-05-20 23:15:32

标签: python-3.x contains magic-methods

因此,我试图通过“ 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)

运行上面的代码给我以下结果,而我希望它说“包含已被覆盖”

我为什么不能覆盖包含的内容?

1 个答案:

答案 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)

但是,不要像在此那样从根本上改变魔术方法的含义。它将使其他人(包括您未来的自我)迷惑

相关问题