Python中将列表元素批量赋值给类self实例属性的最优方案是什么?
方案1:使用有意义的属性名映射(最推荐,可读性可维护性最高)
既然这些属性对应技能的威力、命中率等明确业务含义,直接定义对应属性名列表循环赋值即可,避免无意义的one~nine命名:
class Skill: # 按SKILLS_LIST字典values的顺序定义对应属性名,和你实际业务含义对齐即可 ATTR_NAMES = ("power", "hit_rate", "priority", "attr_type", "cost", "cd", "range", "effect", "desc") def __init__(self, name): skill_detail = SKILLS_LIST[name].values() for attr_name, value in zip(self.ATTR_NAMES, skill_detail): setattr(self, attr_name, value)
后续要修改属性、调整顺序只需要改ATTR_NAMES元组即可,不需要重复写赋值逻辑。
方案2:如果一定要保留one~nine的命名规则
可以动态生成属性名实现批量赋值:
class Skill: def __init__(self, name): skill_detail = SKILLS_LIST[name].values() num_map = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] for num_name, value in zip(num_map, skill_detail): setattr(self, num_name, value)
注意事项
Python 3.7及以上版本字典默认保留插入顺序,如果你用的是更早的Python版本,或者无法保证SKILLS_LIST里字典的key顺序稳定,更稳妥的做法是直接通过key取值,避免依赖values的顺序:
class Skill: # 顺序和SKILLS_LIST里的字典key顺序对齐即可,属性名和key可以相同也可以自定义映射 ATTR_KEYS = ("power", "hit_rate", "priority", "attr_type", "cost", "cd", "range", "effect", "desc") def __init__(self, name): skill_data = SKILLS_LIST[name] for attr_name in self.ATTR_KEYS: setattr(self, attr_name, skill_data[attr_name])
进阶优化(可选)
如果你的Skill类只做数据承载没有太多自定义方法,可以用dataclasses进一步简化代码:
from dataclasses import dataclass @dataclass class Skill: power: int hit_rate: float priority: int attr_type: str cost: int cd: int range: int effect: str desc: str @classmethod def from_name(cls, name): return cls(*SKILLS_LIST[name].values()) # 调用方式 skill = Skill.from_name("火球术")
内容的提问来源于stack exchange,提问作者Roopesh-J
相关产品推荐
相关产品推荐

