2017-08-31 55 views
0

有人可以让我知道如何使用面向对象打印出甲板上的卡片列表吗?我正在上课并试图学习Python 2.我试着分配d = Deck(),然后打印d.cards,但它只返回所有52张卡片的列表中的内存位置。使用OOP在Python中打印卡片列表?

我错过了什么?

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() 

回答

0

什么时候:

print(d.cards) 

print函数只调用列表对象的__str__方法。如果你希望每个元素称为__str__方法,你必须明确地做到这一点:

print([str(card) for card in d.cards]) 
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

+0

谢谢。我改变了def__str __(self)部分并尝试打印d。在() ----> 1打印d 类型错误 TypeErrorTraceback(最新最后调用) :__str__返回非字符串(类型但是我得到一个错误列表) 你能解释为什么吗? – paulnsn

+0

@paulnsn刚刚在修复中编辑过 - “__str__”的返回值需要是一个字符串,所以我在另一个'str'调用中包装列表。 –