Python游戏开发如何优化Unit基类子类初始化减少重复代码?
问题根因
你的简化写法不生效,是因为Python普通实例属性的赋值是值拷贝,不是引用绑定:基类__init__运行时执行self.con = self._con,只是把当时_con的值(初始0)复制给了con属性,后续修改_con时,两个属性完全独立,不会自动同步。
最优重构方案
用属性访问控制逻辑重构基类,完全消除重复赋值代码,同时更贴合游戏buff/debuff的设计需求:
- 带下划线的私有属性存储永久基础数据
- 对外暴露的无下划线属性默认读取基础值,支持临时赋值覆盖(对应buff/debuff效果)
- 把各职业差异化的基础属性定义为类属性,子类只要覆盖对应值即可,不需要重复写
__init__里的赋值逻辑
重构后的基类实现
class Unit: # 基类默认基础属性,子类可直接覆盖 base_ac = 10 base_hp = 10 base_str = 0 base_dex = 0 base_con = 0 def __init__(self, name, ally=False): self._name = name self.ally = ally # 存储buff/debuff带来的临时属性值 self._temp_stats = {} @property def name(self): return self._temp_stats.get("name", self._name) @name.setter def name(self, value): self._temp_stats["name"] = value @property def ac(self): return self._temp_stats.get("ac", self.base_ac) @ac.setter def ac(self, value): self._temp_stats["ac"] = value @property def hp(self): # HP自动关联体质属性,子类不需要重复计算 real_base_hp = self.base_hp + self.base_con return self._temp_stats.get("hp", real_base_hp) @hp.setter def hp(self, value): self._temp_stats["hp"] = value @property def str(self): return self._temp_stats.get("str", self.base_str) @str.setter def str(self, value): self._temp_stats["str"] = value @property def dex(self): return self._temp_stats.get("dex", self.base_dex) @dex.setter def dex(self, value): self._temp_stats["dex"] = value @property def con(self): return self._temp_stats.get("con", self.base_con) @con.setter def con(self, value): self._temp_stats["con"] = value # 工具方法:移除指定属性的临时修正,对应buff/debuff结束 def remove_temp_modifier(self, stat_name): if stat_name in self._temp_stats: del self._temp_stats[stat_name]
子类简化写法
所有子类不需要重复写属性赋值逻辑,甚至不需要重写__init__,只要覆盖对应的基础类属性即可,以Fighter为例:
class Fighter(Unit): base_con = 3 base_str = 3 base_dex = 1
创建Fighter实例后,属性会自动按规则计算:基础HP为10+3=13,力量3,敏捷1,体质3,完全符合预期。
额外收益
这个结构比原来的写法更适配游戏场景:
- 加buff时直接给对应属性赋值即可,比如
fighter.str += 2就实现了力量+2的效果,不需要额外维护独立的buff列表 - buff结束调用
fighter.remove_temp_modifier("str"),属性会自动回到基础值,不需要手动记录原来的基础属性数值 - 新增职业时只需要配置几个基础属性值,没有任何冗余代码
如果觉得逐一定义property太繁琐,也可以通过重写__getattr__/__setattr__实现统一的属性访问逻辑,进一步减少基类的样板代码,核心逻辑和上面的实现完全一致。
内容的提问来源于stack exchange,提问作者Aceinfurno
相关产品推荐
相关产品推荐

