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

Python中如何使用字符串变量调用对应类的已创建实例

解决方案

完全可以实现需求,最稳妥易维护的方式是使用字符串到实例的映射字典,避免冗余的if/elif判断,后续新增舰船类型也只需要更新字典即可,不需要修改业务逻辑。


实现步骤

1. 提前构建舰船类型映射字典

将CSV中存储的舰船类型字符串作为键,对应的starShip实例作为值,统一维护所有舰船的基准属性:

class starShip:
    def __init__(self, cost, speed, armour):
        self.cost = cost
        self.speed = speed
        self.armour = armour

# 键与你的CSV中「Ship Type」列的取值完全对应即可
ship_type_map = {
    "shuttle": starShip(200000, 3, 0),
    "fighter": starShip(500000, 5, 5),
    # 剩余10种舰船直接在这里添加键值对即可
}

2. 修改生成逻辑,通过字符串取对应实例

拿到随机生成的舰船类型字符串后,直接从映射字典中取出对应实例,即可调用属性完成赋值:

def shipGenerator(rowNum):
    for col in dfShips.columns:
        if col == "Ship Type":
            result = randint(1, 20)
            # 拿到字符串格式的舰船类型
            ship_type_str = dfShips.loc[result, "Ship Type"]
            dfGeneratedShips.at[rowNum, col] = ship_type_str
            # 从映射字典中获取对应实例
            target_ship = ship_type_map[ship_type_str]
            # 批量赋值属性
            dfGeneratedShips.loc[rowNum, "Cost"] = target_ship.cost
            dfGeneratedShips.loc[rowNum, "Speed"] = target_ship.speed
            dfGeneratedShips.loc[rowNum, "Armour"] = target_ship.armour

其他可选方案(不推荐)

如果不想维护字典,也可以通过全局变量命名空间查找字符串对应的实例,写法如下:

target_ship = globals()[ship_type_str]

该写法的缺点是容易出现命名冲突,全局变量较多时排查问题难度高,长期维护性不如映射字典。


优化建议

你可以将所有舰船的基础属性(类型名、cost、speed、armour)直接存在CSV文件中,程序启动时读取CSV自动生成ship_type_map,后续新增舰船类型只需要修改CSV,不需要改动代码,更适合TTRPG世界观迭代的需求。

内容的提问来源于stack exchange,提问作者BoazP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:45:01