Skip to main content
 首页 » 编程设计

python之如何将类对象 append 到列表

2025年05月04日31zhwl

在实例化一副牌后 (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