使用OOP在Python中打印Deck列表?

时间:2017-08-31 22:49:30

标签: python

有人可以告诉我如何使用OOP打印出卡片组中的卡片列表吗?我目前正在上课,并试图学习Python 2。

我尝试分配d = Deck()然后打印d.cards但它只返回列表中所有52张卡的内存位置。

我错过了什么?

 import random

 rank = [2,3,4,5,6,7,8,9,10,'Jack','Queen','King','Ace']
 suit = ['Diamonds','Clubs','Hearts','Spade']

 class Card(object):
    def __init__(self,rank,suit):
        self.rank = rank
        self.suit = suit

    def __str__(self):
        return str(self.rank) + ' of ' + str(self.suit)

    def grab_suit(self):
        return self.suit

    def grab_rank(self):
        return self.rank

    def draw(self):
        print (self.suit + self.rank)

class Deck(object):
    def __init__(self):
        self.cards = []    
        for i in rank:
            for j in suit:
                self.cards.append(Card(i,j))

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

2 个答案:

答案 0 :(得分:2)

Deck.__str__中,您希望获得Card s的字符串表示列表:

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

您需要执行此操作的原因是,当Python打印列表时,它会根据__repr__格式化内容,而不是__str__。我们需要字符串表示,因此我们通过显式调用str来生成字符串列表,这将最终调用Card.__str__()

另外需要注意的一点是:当你没有执行其他代码时,为属性编写getter是没有意义的。我建议删除Card.grab_suit()Card.grab_rank()。只需card.suitcard.rank

答案 1 :(得分:0)

什么时候:

print(d.cards)

print函数仅调用列表对象的__str__方法。如果您希望调用每个元素__str__方法,则必须明确地执行此操作:

print([str(card) for card in d.cards])