Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将类对象附加到列表中_Python_List_Class_Object_Append - Fatal编程技术网

Python 如何将类对象附加到列表中

Python 如何将类对象附加到列表中,python,list,class,object,append,Python,List,Class,Object,Append,在实例化一个组(deck=deck())之后,调用deck.show\u deck()只需打印出52次“两颗钻石”。“复制”部分符合,但似乎没有帮助。有什么建议吗 import copy from card import Card class Deck: card_ranks = ['ace','king','queen','jack','ten','nine','eight','seven','six','five','four','three','two'] card_s

在实例化一个组(
deck=deck()
)之后,调用
deck.show\u deck()
只需打印出52次“两颗钻石”。“复制”部分符合,但似乎没有帮助。有什么建议吗

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()
卡片:


这里的问题是
Card
类有一个name变量,该变量与
Card
类的所有实例共享

如果您有:

class Card:

    card_name = ''
这意味着所有
Card
对象将具有相同的名称(
Card\u 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
不允许您保留类变量的不同状态

此外,我建议您更改
以拥有自己的
\uuuuu str\uuuuu
方法,如果您想打印出来:

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

这里的问题是
Card
类有一个name变量,该变量与
Card
类的所有实例共享

如果您有:

class Card:

    card_name = ''
这意味着所有
Card
对象将具有相同的名称(
Card\u 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
不允许您保留类变量的不同状态

此外,我建议您更改
以拥有自己的
\uuuuu str\uuuuu
方法,如果您想打印出来:

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

进一步阐述shuttle87所说的:

class Card:

    card_name = ''
使
card\u name
成为静态变量(在该类的所有实例之间共享)

一旦您使变量成为非静态变量(通过在
\uuuu init\uuuu
方法中使用
self.card\u name
),您就不必担心复制部分,因为card类的每个实例都有自己的唯一名称

注意,deck中的
deck
在代码中也是静态的

from card import Card

class Deck:
    # these 2 can be static, they never change between copies of the deck class
    card_ranks = ['ace','king','queen','jack','ten','nine','eight','seven','six','five','four','three','two']
    card_suites = ['clubs','hearts','spades','diamonds']

    def __init__(self):
        # this shouldn't be static since you might want to shuffle them 
        # or do other things that make them unique for each deck
        self.cards = []

        for suite in Deck.card_suites:
            for rank in Deck.card_ranks:
                self.cards.append(Card(rank, suite))

    def show_deck(self):
        for item in self.cards:
            print item




进一步阐述shuttle87所说的:

class Card:

    card_name = ''
使
card\u name
成为静态变量(在该类的所有实例之间共享)

一旦您使变量成为非静态变量(通过在
\uuuu init\uuuu
方法中使用
self.card\u name
),您就不必担心复制部分,因为card类的每个实例都有自己的唯一名称

注意,deck中的
deck
在代码中也是静态的

from card import Card

class Deck:
    # these 2 can be static, they never change between copies of the deck class
    card_ranks = ['ace','king','queen','jack','ten','nine','eight','seven','six','five','four','three','two']
    card_suites = ['clubs','hearts','spades','diamonds']

    def __init__(self):
        # this shouldn't be static since you might want to shuffle them 
        # or do other things that make them unique for each deck
        self.cards = []

        for suite in Deck.card_suites:
            for rank in Deck.card_ranks:
                self.cards.append(Card(rank, suite))

    def show_deck(self):
        for item in self.cards:
            print item





我会先创建一个包含所有卡片的临时列表,然后再将临时列表深度复制到
deck
中,临时列表会在init中吗?您不会在此处显示
卡片
代码,但为什么需要
深度复制
,尤其是在您第一次实例化它的情况下?这里有点不对劲。卡片相对来说很琐碎,但我会把它加进去here@user2372996是的,临时列表会出现在
\uuuu init\uuuu
中,但我忍不住认为这里存在设计问题,因为您真的不应该在这里需要deepcopy。至于你问题中的代码不起作用的原因,我现在只是想弄清楚。我会先创建一个包含所有卡的临时列表,然后再将临时列表复制到
deck
中,临时列表会在init中吗?你不会在这里显示你的
代码,但是为什么需要
deepcopy
,特别是如果您是第一次实例化它的话?这里有点不对劲。卡片相对来说很琐碎,但我会把它加进去here@user2372996是的,临时列表会出现在
\uuuu init\uuuu
中,但我忍不住认为这里存在设计问题,因为您真的不应该在这里需要deepcopy。至于你问题中的代码不起作用的原因,我现在只是想弄清楚。比我快30秒。更好的是:
u'%s of%s'(卡片等级,卡片套装)
(只要你在任何地方都把它改成
card\u套装
)。在这里我想
card
是微不足道的。。。非常感谢你在30秒前吃掉我。更好的是:
u'%s of%s'(卡片等级,卡片套装)
(只要你在任何地方都把它改成
card\u套装
)。在这里我想
card
是微不足道的。。。非常感谢。我不相信这个副本实际上会帮助解决类变量中存储的状态的问题,我认为您提到这一点是为了解决答案中值得向上投票的一个重要部分,所以您可能希望对此进行测试。另外,要在答案文本中设置内联代码的格式,您可以使用反勾号。谢谢格式帮助。我测试了上面的代码(从我的电脑上的源文件复制的)我不相信副本实际上会帮助解决类变量中存储的状态的问题,我认为你提到了答案中一个重要的值得向上投票的部分,所以你可能希望测试一下。另外,要在答案文本中设置内联代码的格式,您可以使用反勾号。谢谢格式帮助。我测试了上面的代码(从我电脑上的源文件复制)