Python - 使用for循环和列表为类实例分配属性

时间:2013-12-23 17:00:06

标签: python data-structures

嗨大家好我正在尝试使用Python(我发现了pygame.org并且想要玩游戏),我试图从配置文件中读取一些设置。我希望能够动态更改统计数据。 (所以,如果我想改变战斗机击中的难度或者向导运行的速度,那么我就能做到这一点。)我希望能够从列表中读取并为列表中的每个实例创建一个属性基本上这个:

for stat in Character.stats:
    self.stat = parser.get(self.char_class, stat)

最终发生的事情是有一个对象,其属性名称'stat'包含分配的最后一个值。我想要发生的是为列表中的每个项目创建一个属性,然后从配置文件中分配相关的值。

这里有更多上下文代码:


class Character(object):

    stats = ["level_mod", 
            "power",
            "speed",
            "hit",
            "evade",
            "magic",
            "stamina",
            "magic_defense",
            "intelligence"]

    def __init__(self, name, rpg_id):
        self.name = name
        self.rpg_id = rpg_id
        self.__setStats()

    def __setStats(self):
        parser = SafeConfigParser()
        parser.read('char_config.cfg')
        for stat in Character.stats:
            self.stat = parser.get(self.char_class, stat)

谢谢你的时间!

3 个答案:

答案 0 :(得分:0)

您想要setattr(obj, attrname, value)

答案 1 :(得分:0)

你可以使用,setattr:

for stat in Character.stats:
    setattr(self, stat, parser.get(self.char_class, stat))

或手动访问 dict

for stat in Character.stats:
    self.__dict__[stat] = parser.get(self.char_class, stat))

答案 2 :(得分:0)

您最好通过添加Stats类来重新设计游戏的这一部分。

class Stats:

    STATS = ["level_mod", 
            "power",
            "speed",
            "hit",
            "evade",
            "magic",
            "stamina",
            "magic_defense",
            "intelligence"]


    def __init__(self, conf_file=None):
        self.__stats = {}
        if conf_file is not None:
            self.loads_stats_from_file(conf_file)

    def load_stats_from_file(self, conf_file):
        """
        Here add the pairs <stat_name>:<value> 
        to the self.__stats dict. For that just parse the config
        file like before.
        """
        pass

    def get_stat(self, stat_name):
        return self.__stats[stat_name]

    def set_stat(self, stat_name, value):
        self.__stats[stat_name] = value

然后,您可以向Stats添加Character个实例。

class Character(object):

    def __init__(self, name, rpg_id):

        self.stats = Stats("char_config.cfg")
        self.name = name
        self.rpg_id = rpg_id

这样可以提高可用性并解除StatsCharacter逻辑。此外,您的问题从“将属性添加到对象”减少到“将项目添加到字典”