对象列表上的__str__方法

时间:2019-05-04 09:41:04

标签: python

python的新手,尝试创建卡片组并希望实现print(deck)=>的打印方法,该方法给出了我的卡片的打印列表。

我的课堂PlayCard具有 str 方法,该方法可以很好地打印单张纸牌。

但是,当我创建Deck.cards对象(PlayingCard对象的列表)时,似乎无法一次打印所有纸牌。

尝试将 str 替换为 repr 。尝试返回 str

中的字符串列表
from enum import Enum

class Value(Enum):

    Two = 2
    Three = 3
    Four = 4
    Five = 5 
    Six = 6
    Seven = 7
    Eight = 8
    Nine = 9
    Ten = 10
    Jack = 11
    Queen = 12
    King = 13 
    Ace = 14

class Suit(Enum):

    Spades = 1
    Hearts = 2
    Clubs = 3
    Diamonds = 4


class PlayingCard():

    def __init__(self,value,suit):
        self.value = value
        self.suit = suit


    def __str__(self):
        return '{} of {}'.format(Value(self.value).name, Suit(self.suit).name)

class Deck():

    def __init__(self):
        self.cards=[PlayingCard(val,suit) for val in Value for suit in Suit]

    def __str__(self):
        return str(self.cards)


deck = Deck()
print(deck)

返回

[<__main__.PlayingCard object at 0x000001875FEC0080>,
<__main__.PlayingCard object at 0x000001875FE9EE48>,
....
....
]

2 个答案:

答案 0 :(得分:3)

您只需要将__str__类的PlayingCard方法替换为__repr__方法:

class PlayingCard():

    def __init__(self,value,suit):
        self.value = value
        self.suit = suit

    def __repr__(self):
        return '{} of {}'.format(Value(self.value).name, Suit(self.suit).name)

或者,您可以更改__str__类中的Deck方法来获取每张卡的字符串表示形式:

class Deck():

    def __init__(self):
        self.cards=[PlayingCard(val,suit) for val in Value for suit in Suit]

    def __str__(self):
        return str([str(card) for card in self.cards])

然后您将获得正确的输出:

...

deck = Deck()
print(deck)

输出:
(第二种方法将在每张打印的卡片周围添加引号)

  

[黑桃两,心两,球杆两,钻石两,球三   黑桃,三颗心,三颗球棍,三颗钻石,四颗   黑桃,四心,四个俱乐部,四个钻石,五个   黑桃,五心,五球棍,五颗钻石,六颗   黑桃,红心六,俱乐部六,钻石六,黑桃七,   七个心,七个俱乐部,七个钻石,八个黑桃,   八心八俱乐部八钻石八九黑桃   九心,九俱乐部,九钻石,黑桃十,十   心,十个俱乐部,十个钻石,黑桃杰克,心形杰克,   俱乐部杰克,钻石杰克,黑桃皇后,红心皇后,   俱乐部女王,钻石女王,黑桃王,红心王,   俱乐部之王,钻石之王,黑桃王牌,红桃王牌,   俱乐部,钻石王牌]

当您在__str__对象上调用list时,它将遍历列表的每个元素并在该对象上调用__repr__以获取其表示形式。

因此,当您致电print(deck)时,您会得到:

--> deck.__str__()
--> str(self.cards)
--> [card.__repr__() for card in self.cards]

答案 1 :(得分:1)

请注意,repr应该返回可重新创建对象的python代码。

我要这样做的方法是为PlayingCard使用NamedTuple

from typing import NamedTuple
class PlayingCard(NamedTuple):
    value: Value
    suit: Suit

*请注意,类型提示是可选的,但非常方便。

然后NamedTuple已经实现了repr和str,因此您无需重新实现任何功能。