在实例化一副牌后 (deck = Deck()),调用 deck.show_deck() 只会打印出“两个方 block ”52 次。 “复制”部分符合 this answer ,但似乎没有帮助。有什么建议吗?
import copy
from card import Card
class Deck:
card_ranks = ['ace','king','queen','jack','ten','nine','eight','seven','six','five','four','three','two']
card_suites = ['clubs','hearts','spades','diamonds']
deck = []
def __init__(self):
#create a deck of 52 cards
for suite in Deck.card_suites:
for rank in Deck.card_ranks:
Deck.deck.append(copy.deepcopy(Card(card_rank=rank, card_suite=suite)))
def show_deck(self):
for item in Deck.deck:
print item.get_name()
卡片:
class Card:
card_name = ''
def __init__(self, card_rank, card_suite):
self.card_rank = card_rank.lower()
self.card_suite = card_suite.lower()
Card.card_name = card_rank + " of " + card_suite
def get_name(self):
return Card.card_name
请您参考如下方法:
这里的问题是 Card 类有一个名称变量,它与 Card 类的所有实例共享。
当你有:
class Card:
card_name = ''
这意味着所有 Card 对象都将具有相同的名称 (card_name),这几乎肯定不是您想要的。
你必须让名字成为实例的一部分,而不是像这样:
class Card:
def __init__(self, card_rank, card_suite):
self.card_rank = card_rank.lower()
self.card_suite = card_suite.lower()
self.card_name = card_rank + " of " + card_suite
def get_name(self):
return self.card_name
你会发现 deepcopy 不需要,也从来不需要,但它确实告诉你 deepcopy 不允许你保持类的不同状态变量。
此外,如果您想打印出来,我建议您更改 Card 使其拥有自己的 __str__ 方法:
class Card:
def __init__(self, card_rank, card_suite):
self.card_rank = card_rank.lower()
self.card_suite = card_suite.lower()
def __str__(self):
return "{0} of {1}".format(card_rank, card_suit)
这使用 Python 语言本身来打印类,并且有一个好处,即您的类现在可以在打印语句和字符串转换中正常工作。所以不是:
print some_card.get_name()
你可以做
print some_card
