2013-12-23 33 views
2

嗨,伙计们我正在试验Python(我发现pygame.org并想玩弄),我试图从配置文件中读取一些设置。我希望能够随时更改统计数据。 (所以如果我想改变战斗机命中的困难程度或者向导运行得有多快,那么我就可以做到这一点。)我希望能够从列表中读取并为列表中的每个实例创建一个属性基本上这个:Python - 使用for循环和列表为属性指派给一个类实例

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) 

感谢您的时间!

+0

太棒了!谢谢KrzysztofRosiński我使用了setattr(),它工作得很好。 我也将创建一个新的'统计'班,因为我喜欢Raydel Miranda所说的。 谢谢大家! – gqbriggs

回答

0

可以使用,SETATTR:

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

或手动添加一个访问字典

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

直接访问'__dict__'将绕过任何现有的描述符(属性等)。 –

0

你想setattr(obj, attrname, value)

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逻辑。此外,您的问题从“将属性添加到对象”减少到“将项目添加到字典”