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
相关产品推荐
相关产品推荐

