4

有人可以向我解释如何通过遍历名称列表和字典列表来返回类的新实例吗?

我知道我可以使用 解包我的字典**,并且我知道我可以遍历我的字典列表。

所以我尝试创建一个for循环函数,CardcardList.

这是我认为可行的代码:

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. IE:

[Knight, Mage, Warrior, ...]

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

Knight = Card(**cardList[0])

Mage = Card(**cardList[1])

Warrior = Card(**cardList[2]

等等等等。

那可能吗?或者我是否需要使用列表理解建议将所有类实例存储到一个列表中,然后必须使用new_cards[0].nameor访问这些实例new_cards[1].attack

4

2 回答 2

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
于 2013-05-29T17:28:04.993 回答
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

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

于 2013-05-29T19:09:44.863 回答