如何优化Game类中Player属性操作代码,避免使用__getattribute__与__setattr__
代码优化方案
优化后的完整代码
class Player: def __init__(self, name, score=500, daily_score=0): self.name = name self.score = score self.daily_score = daily_score # 新增方法:快速转换为字典格式 def to_dict(self): return { "name": self.name, "score": self.score, "daily_score": self.daily_score } class Game: def __init__(self, player1, player2, player3, player4, score_pair1, score_pair2): self.player1 = player1 self.player2 = player2 self.player3 = player3 self.player4 = player4 self.score_pair1 = score_pair1 self.score_pair2 = score_pair2 self.Online_Players_Dict = [] self.Temp_Players_Dict = [] self.Temp_import_players = [] # 把玩家属性名存为元组,方便后续遍历 self._player_attrs = ("player1", "player2", "player3", "player4") def create_temp_players(self): # 将Temp_import_players转换为以name为键的字典,优化查找效率 import_players_map = {p["name"]: p for p in self.Temp_import_players} for attr_name in self._player_attrs: # 用getattr替代__getattribute__,更符合Python常规写法 current_value = getattr(self, attr_name) if not isinstance(current_value, Player): player_name = current_value # 从映射字典中快速查找导入的玩家数据 import_data = import_players_map.get(player_name) if import_data: # 创建Player实例并赋值,用setattr替代__setattr__ new_player = Player( player_name, import_data["score"], import_data["daily_score"] ) setattr(self, attr_name, new_player) player_dict = new_player.to_dict() self.Online_Players_Dict.append(player_dict) else: # 创建默认分数的Player实例 new_player = Player(player_name) setattr(self, attr_name, new_player) player_dict = new_player.to_dict() self.Online_Players_Dict.append(player_dict) self.Temp_Players_Dict.append(player_dict)
核心优化点
- 替换特殊方法:用
getattr(self, attr_name)替代self.__getattribute__(i),setattr(self, attr_name, value)替代self.__setattr__(i, value),这两个是Python官方推荐的属性操作API,可读性更强,避免直接调用底层特殊方法。 - 优化查找性能:将
Temp_import_players转换为字典映射,把原来的O(n)循环查找改成O(1)的键值查找,尤其是导入玩家数量较多时,性能提升明显。 - 消除代码冗余:给Player类新增
to_dict方法,避免重复编写字典转换逻辑,让代码更简洁。 - 提升可读性:将玩家属性名存为类内元组
_player_attrs,遍历逻辑更清晰;变量命名更直观,降低后续维护成本。
内容的提问来源于stack exchange,提问作者DmitriyN
相关产品推荐
相关产品推荐

