Python中如何在字典/类中存储类对象引用并保持值同步?
替代eval()的类对象引用同步方案
核心思路
放弃用字符串存储布尔表达式再通过eval()执行的方式,直接存储类实例的属性引用或封装好的判断函数,这样属性值更新时,判断逻辑能直接读取最新值,实现天然同步。
方案1:用lambda封装判断逻辑
修改ListSetting类,让它接收一个判断函数而非字符串表达式,创建实例时直接把curWeapon的属性逻辑封装进去:
class ListSetting: def __init__(self, condition_func, a, b, c, d): self.condition_func = condition_func self.a = a self.b = b self.c = c self.d = d # 添加到列表时,传入绑定curWeapon属性的lambda wishLists.append(ListSetting(lambda: curWeapon.pveFlag or not curWeapon.pvpFlag, a, b, c, d)) # 后续计算布尔值时,直接调用函数 for setting in wishLists: if setting.condition_func(): # 执行对应业务逻辑 pass
这种方式下,curWeapon的pveFlag/pvpFlag更新后,调用condition_func()会直接取到最新值,完全同步,且彻底规避了eval()的安全风险。
方案2:拆分逻辑为可复用函数
如果判断逻辑需要在多处复用,可以把逻辑抽成单独函数,再传入ListSetting:
def check_weapon_condition(weapon): return weapon.pveFlag or not weapon.pvpFlag # 创建实例时绑定curWeapon wishLists.append(ListSetting(lambda: check_weapon_condition(curWeapon), a, b, c, d))
特殊场景处理:实例被替换的情况
如果curWeapon不是修改属性,而是会被重新赋值为新的WeaponInfo实例,可以用一个容器类持有实例引用,避免lambda绑定旧对象:
class WeaponContainer: def __init__(self, weapon): self.current_weapon = weapon # 初始化容器 weapon_container = WeaponContainer(curWeapon) # 传入绑定容器的lambda wishLists.append(ListSetting( lambda: weapon_container.current_weapon.pveFlag or not weapon_container.current_weapon.pvpFlag, a, b, c, d )) # 后续替换实例时,更新容器即可 weapon_container.current_weapon = new_weapon_instance
内容的提问来源于stack exchange,提问作者Henry Smith
相关产品推荐
相关产品推荐

