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>,
....
....
]
答案 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,因此您无需重新实现任何功能。