You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:10:47