gpt4 book ai didi

python - 如何使用 __str__ 方法打印列表?

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:59 25 4
gpt4 key购买 nike

class Deck:

def __init__(self):
self.cards=[]
for suit in range(4):
for rank in range(1,14):
card=Card( suit, rank )
self.cards.append(card)

def __str__ (self):
res=[]
for card in self.cards:
res.append(str(card))

return '\n'.join(res)

def pick_card(self):
from random import shuffle
shuffle(self.cards)
return self.cards.pop()

def add_card(self,card):
if isinstance(card, Card): #check if card belongs to card Class!!
self.cards.append(card)

def move_cards(self, gen_hand, num):
for i in range(num):
gen_hand.add_card(self.pick_card())


class Hand(Deck):

def __init__(self, label=''):
self.cards = []
self.label = label

def __str__(self):
return 'The {} is composed by {}'.format(self.label, self.cards)

mazzo_uno = Decks()
hand = Hand('New Hand')
mazzo_uno.move_cards(hand, 5)
print(hand)

我正在尝试学习面向对象编程。当我尝试从子类 Hand() 打印对象 hand 时,我遇到了这个问题。我打印了类似 <ma​​in.Card 对象位于 0x10bd9f978> 的内容,而不是 self.cards 列表中 5 张卡片的正确字符串名称:

The New Hand is composed by [<__main__.Card object at 0x10bd9f978>, 
<__main__.Card object at 0x10bd9fd30>, <__main__.Card object at 0x10bd9fe80>,
<__main__.Card object at 0x10bcce0b8>, <__main__.Card object at 0x10bd9fac8>]

我也尝试这样做来将 self.cards 转换为字符串,但我得到“TypeError:序列项 0:预期的 str 实例,找到卡”

def __str__(self):
hand_tostr = ', '.join(self.cards)
return 'The {} is composed by {}'.format(self.label, hand_tostr)

我在这个网站上的其他答案中读到我应该使用 __repr__ 但我不明白如何将它添加到 Hand 类中。

最佳答案

__repr____str__服务于不同的目的,但工作方式相同。

您可以阅读this帮助您在两种方法之间进行选择。

<小时/>

您可以更改 __str__ Hand 类的方法如下:

class Hand:

def __str__(self):
hand_tostr = ', '.join(map(str, self.cards)) # I use map to apply str() to each element of self.cards
return 'The {} is composed by {}'.format(self.label, hand_tostr)
<小时/>

如果您想更改 __repr__ Card 类的方法,您可以尝试类似的方法(您没有提供 Card 类的代码)

class Card:
#your code

def __repr__(self):
return <some string>

现在,如果你这样做str(<list of Card objects>)它将使用 __repr__每个卡片实例上的方法来显示您想要的内容。我不是这个解决方案的忠实粉丝,对于您的情况,我会使用第一个解决方案,因为您可能希望为其他情况保留卡片对象的默认表示。

<小时/>

小心这段代码:

def add_card(self,card):
if isinstance(card, Card): #check if card belongs to card Class!!
self.cards.append(card)

如果card不是Card的实例,你就不会引发任何事情。这意味着如果您使用错误的参数使用此方法,错误将被隐藏,并且您将不知道牌组尚未更改。这是相当危险的。你可以这样做:

def add_card(self,card):
assert(isinstance(card, Card)), "card parameter of add_card must be an instance of Card class"
self.cards.append(card)

以更Pythonic的方式,您可以使用 typehint通知您的类的用户该卡应该是 Card 的实例。然后相信 python 的鸭子打字风格,或者使用像 mypy 这样的工具。以验证该方法是否正确使用。

关于python - 如何使用 __str__ 方法打印列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53653859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com