首页 > 解决方案 > 如何将具有 2 个参数的类的字典复制到 2 个列表中

问题描述

我有一个包含 2 个参数列表的类,如果用户确认,我必须将它们保存到 2 个列表中,修改它并从第二行恢复原始列表。这是我的代码:

    class Pokemon:
        def __init__(self):
            self.pokemon = {"Poke_Name": "", "Poke_Specie": "", "Poke_Type": "", "Poke_Weight": "", 
            "Poke_Height": "", "Poke_Abilities": [], "Poke_Stats": [], "URL": ""}

        def set_Poke_Name(self, name):
            self.pokemon["Poke_Name"] = name

        def set_Poke_Specie(self, specie):
            self.pokemon["Poke_Specie"] = specie

        def set_Poke_Type(self, tipo):
            self.pokemon["Poke_Type"] = tipo

        def set_Poke_Weight(self, peso):
            self.pokemon["Poke_Weight"] = peso

        def set_Poke_Height(self, altezza):
            self.pokemon["Poke_Height"] = altezza

        def add_Abilities(self, abilita):
            self.pokemon["Poke_Abilities"].append(abilita.poke_abilities)

        def add_Stats(self, stats):
            self.pokemon["Poke_Stats"].append(stats.poke_stats)

        def set_url(self, url):
            self.pokemon["URL"] = url

        def __str__(self):
            return str(self.pokemon)    


    class Poke_Abilities:
        def __init__(self):
            self.poke_abilities = {"Nome": "", "Speciale": ""}

        def set_abilita_nome(self, nome):
            self.poke_abilities["Nome"] = nome

        def set_abilita_speciale(self, speciale):
            self.poke_abilities["Speciale"] = speciale

        def __str__(self):
            return self.poke_abilities
    ...

    nomi = []
    special = []
    for j in pok["Poke_Abilities"]:
        nomi[j] = j["Nome"]
        special[j] = j["Speciale"]

这是错误:

nomi[j] = j["Nome"]
TypeError: list indices must be integers or slices, not dict

标签: pythonlistclass

解决方案


为什么要创建一个包含所有其他 dict 属性的类?很抱歉这么说,但这是糟糕的设计而不是 pythonic。

你应该这样做:

class Pokemon:
    def __init__():
        self.name = ""
        self.specie = ""
        self.type = ""
        self.weight = ""
        self.height = 
        self.abilities = []
        self.stats = []
        self.url = ""

PokeAbilities 也一样。就是这样。没有设置方法。这不是pythonic。您可以设置这样的属性:

pokemon = Pokemon()
pokemon.name = "Pikachu"

或者通过向__init__函数添加和传递参数。

如果您在设置属性时需要更多控制,请使用properties

我不完全回答你的问题,但是一旦你做了一个好的设计,错误就会消失。

您还有其他选择,可以使用namedtuplesdataclasses


推荐阅读