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
是微不足道的。。。非常感谢。我不相信这个副本实际上会帮助解决类变量中存储的状态的问题,我认为您提到这一点是为了解决答案中值得向上投票的一个重要部分,所以您可能希望对此进行测试。另外,要在答案文本中设置内联代码的格式,您可以使用反勾号。谢谢格式帮助。我测试了上面的代码(从我的电脑上的源文件复制的)我不相信副本实际上会帮助解决类变量中存储的状态的问题,我认为你提到了答案中一个重要的值得向上投票的部分,所以你可能希望测试一下。另外,要在答案文本中设置内联代码的格式,您可以使用反勾号。谢谢格式帮助。我测试了上面的代码(从我电脑上的源文件复制)