更改对象属性中的值如何在类中的打印上显示

时间:2016-10-26 11:17:08

标签: python class python-3.x

我有一个课程,我为德州扑克游戏初始化了一副52张牌,然后从牌组中随机抽取一张牌,这取决于玩家的数量:

class Cards:
    def __init__(self):
        suits = ['s', 'c', 'd', 'h']
        values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
        deck = set(itertools.product(values, suits))
        self.drawn_cards = random.sample(deck,(5 + 2 * number_of_players))

然而,在打印卡片时,我希望将11替换为J',将12替换为' Q',依此类推。我不知道该怎么做。在这里做了一些搜索后,我最终将其添加到课程中:

def __str__(self):
        text = ""
        for x, y in self.drawn_cards:            
            if x == 11:
                text = "J"
            elif x == 12:
                text = "Q"
            elif x == 13:
                text = "K"
            elif x == 14:
                text = "A"
            else:
                text = x

但是当我初始化一个对象(经销商)时:

dealer = Cards()

然后打印抽出的卡片:

print(dealer.drawn_cards)

我得到:

[(4, 'h'), (14, 'd'), (13, 's')........]

取代期望的:

[(4, 'h'), ('A', 'd'), ('K', 's')........]

不胜感激。

1 个答案:

答案 0 :(得分:1)

您正在打印这些卡而不是调用其__str__;无论哪种方式,由于__str__未在您的实施中返回字符串,因此会出错。

最简单的解决方案是创建一个类级别映射,其中包含范围[11, 14]的数字卡,然后在其__str__中创建元组的中间翻译列表并返回其字符串表示形式:< / p>

class Cards:

    # translate numbers to cards
    _tr = {11: 'J', 12 :'Q', 13: 'K', 14: 'A'}

    def __init__(self):
        suits = ['s', 'c', 'd', 'h']
        values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
        deck = set(itertools.product(values, suits))
        self.drawn_cards = random.sample(deck,(5 + 2 * number_of_players))

    def __str__(self):
        r = [(x, y) if x not in self._tr else (self._tr[x], y) for x,y in self.drawn_cards]
        return str(r)

现在,打印您的实例将产生所需的结果:

dealer = Cards()

print(dealer)
[(9, 'c'), ('A', 'c'), (4, 'd'), (5, 'd'), (4, 's'), ('J', 'c'), (6, 'h'), ('A', 's'), (10, 'c')]