Python中如何通过输入实例名获取对应类实例的属性值?
解决方法
别用eval或exec处理用户输入,既不安全又容易出问题。推荐用字典映射的方式,把用户输入的实例名称(字符串)和对应的实例对象绑定,代码清晰还安全。
修改后的完整代码:
# Employee是一个初始化参数为self、name、status的类 e1 = Employee("Tom, Lincoln", "Present") e2 = Employee("Sam, Bradley", "Absent") print(e1.status) # 用字典存储实例名称与对应对象的映射 employee_map = { "e1": e1, "e2": e2 } while True: try: cmd = input("Cmd: ") if cmd == "status_check": who = input("Who: ") # 从字典中取出实例并获取status if who in employee_map: print(employee_map[who].status) else: print(f"找不到名为{who}的员工实例") except KeyboardInterrupt: # 处理Ctrl+C退出循环的场景 break
为什么不推荐用eval?
eval(who).status虽然能实现功能,但如果用户输入的不是e1/e2,而是恶意代码(比如__import__('os').system('rm -rf /')),会直接执行,带来严重安全风险。字典映射只允许预设的实例名称,完全规避了这个问题。
备选方案(若坚持用数字提取)
如果一定要通过提取输入中的数字来实现,可以这么写,但可读性和灵活性不如字典:
if who.startswith("e") and who[1:].isdigit(): num = int(who[1:]) # 把实例按顺序放进列表 employees = [e1, e2] if 1 <= num <= len(employees): print(employees[num-1].status) else: print("无效的实例编号") else: print("输入格式错误,请输入e1或e2")
还是首推字典映射的方案,代码维护性和安全性都更优。
内容的提问来源于stack exchange,提问作者Ppeng
相关产品推荐
相关产品推荐

