首页 > 解决方案 > 我如何实现塔罗牌是直立的还是倒立的?

问题描述

我修改了 Luciano Ramalho 的 Fluent Python 中的 FrenchDeck 类,以尝试构建塔罗牌。由于元组是不可变的,我无法存储卡是否在元组中反转,所以我实现了如下所示的方向。

import collections
from random import getrandbits

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

class FrenchTarot:
  ranks = [str(n) for n in range(1,11)]+['Page','Knight','Queen','King']
  suits = 'wands swords coins cups'.split()
  major_arcana = ['The Fool', 'The Magician', 'The High Priestess', 'The Empress',
                  'The Hierophant', 'The Lovers', 'The Chariot', 'Strength',
                  'The Hermit', 'Wheel of Fortune', 'Justice', 'The Hanged Man',
                  'Death', 'Temperance', 'The Devil', 'The Tower', 'The Star',
                  'The Moon', 'The Sun', 'Judgement', 'The World']

  def __init__(self):
    self.minor = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
    self.major = [Card(rank, 'Major Arcana') for rank in self.major_arcana]
    self._cards = self.major + self.minor

  def __len__(self):
    return len(self._cards)

  def __repr__(self):
    return f'Tarot Deck containing {len(self)} cards, {len(self.major)} Major Arcana, and {len(self.minor)} Minor Arcana'

  def __getitem__(self,position):
    if getrandbits(1):
      orientation = 'Upright'
    else:
      orientation = 'Reversed'
    return self._cards[position], orientation

  def __setitem__(self, position, card):
    self._cards[position] = card

当我尝试测试时,问题就来了

Card('The Fool', 'Major Arcana') in deck

它返回 False,让它返回 True 的唯一方法是指定方向(并随机猜测正确)。我不确定如何解决问题

编辑:很抱歉在第一次发布错误的代码块哎呀

标签: python

解决方案


如果您想使用card in deck,但in没有按照您想要的方式行事,您可以使用__contains__魔法方法覆盖该行为。这将使您能够编写忽略方向属性的自定义测试。

您还可以创建一个Card覆盖__eq__以比较他们的等级和西装但忽略他们的方向的类,以便您可以==直观地使用。


推荐阅读