从Python中的名称列表创建多个类实例?

时间:2013-05-29 17:13:14

标签: python python-2.7

有人可以通过迭代一个名单列表和一个dicts列表来向我解释如何返回一个新的类实例吗?

我知道我可以使用**解压缩字典,我知道我可以遍历我的字典列表。

所以我尝试创建一个for循环函数,为Card中的每张卡片创建cardList类的新实例。

以下是我认为可行的代码:

def createCardInstances(x):
    for i in range(len(x)):
        namesOfCards[i] = Card(**cardList[i])
        return namesOfCards[i]

namesOfCards是一个卡片名称列表,我想将其转换为Card类的实例。 cardList是代表卡片及其值的词典列表。

例如,我可以这样做:

Knight = Card(**cardList[0])

哪个工作正常。但是,如果我正在开发一款纸牌游戏并拥有超过100张个人卡或更多卡,我希望避免单独写出每个卡名并每次复制\粘贴=Card(**cardList[])代码。

如何自动创建新实例?这甚至可行吗?


编辑:

我正在尝试使用namesOfCards中的名称来创建Card的新实例。有人建议我在创建卡牌游戏时学习python的下一步是让它更加面向对象。

所以我现在的目标是使用保存在列表namesOfCards中的卡片名称 - 来创建Card的新实例。即:

[Knight, Mage, Warrior, ...]

我希望有能力接受这些并做到这一点:

Knight = Card(**cardList[0])

Mage = Card(**cardList[1])

Warrior = Card(**cardList[2]

依此类推。

这可能吗?或者我是否需要使用列表推导建议将所有类实例存储到列表中,然后使用new_cards[0].namenew_cards[1].attack来访问实例?

2 个答案:

答案 0 :(得分:2)

当您将名单传递给他时,您将返回个人卡吗?如果cardNames是名称列表,则不应使用Card个对象覆盖它。你应该能够做这样的事情吗?

new_cards = [Card(**card) for card in card_list]  # make new card objects
cards = {card.name: card for card in new_cards}  # dict to ref cards by name 
print cards['Knight'].name

或只是

cards = {card['name']: Card(**card) for card in card_list}

如果您想将这些卡片仅限制在namesOfCards中。你可以

cards = {card['name']: Card(**card) for card in card_list if card['name'] in names_of_cards}

注意:这都假设您没有两张同名的卡片)

也可以将这些卡片放入您的本地命名空间,就像问题一样,但我会高度反对它。但如果你真的想要...

locals().update(cards)
print Knight.name

答案 1 :(得分:1)

确保您的列表包含类似

的字符串
CARDS = ['Knght', 'Mage'] #and so on

我不确定这是否是你需要的,但请看下面的代码:

CARD = ['knight','mage']

class cards:
    def __init__(self, name):
        self.n = name
        self.attack = "attack " + self.n

print knight.attack

使用它可以遍历列表或字典来创建类的实例