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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:33:24