我有一个程序,我需要从一个字符串变量中获取类的多个实例之一的信息。
我已经向我的一个程序员朋友寻求帮助,但是他专门研究C#而不是python3,因此他能提供的最好方法是尝试使用exec()命令。这对我没有帮助。
说我有一些代码来设置有关汽车的信息
class Cars:
def __init__(self, Brand, Model, Owner):
self.Brand = Brand
self.Model = Model
self.Owner = Owner
Car1 = Cars("Honda", "Civic", "Jon Arbuckle")
Car2 = Cars("Ford", "Focus", "Martha Jones")
MysteryCar = "Car1"
反正仅知道"Jon Arbuckle"
中存储了什么,是否有返回值MysteryCar
的原因?
答案 0 :(得分:5)
使用locals()
作为本地变量的名称(作为字符串)作为其键并将其值作为.....以及其值的决定!
print(locals()[MysteryCar].Owner)
另一种替代方法是使用eval
,这是一种将字符串评估为python代码的方法。因此,您可以执行以下操作:
print(eval(MysteryCar).Owner)
但是一般来说eval
被认为是有风险的,在我看来,应避免使用...
例如,如果您的MysteryCar
是来自用户的输入,如果用户输入一些危险的命令,则可能导致严重的问题。
另一方面,使用locals
可以使用户知道使用try/except KeyError
的选择是否错误
答案 1 :(得分:2)
您的朋友是正确的。您可以使用exec
运行一些Python代码,这些代码使用MysteryCar
指向的字符串来定义。我喜欢f字符串(Python 3.6+),但是您也可以通过其他方式格式化您的强字符串:
>>> command = f"car_owner = {MysteryCar}.Owner"
>>> exec(command)
>>> print(car_owner)
Jon Arbuckle
MysteryCar
将在f字符串中求值为Car1
,因此您正在执行命令
car_owner = Car1.Owner
上方。
但是,正如一些评论所指出的那样,我会怀疑这是否是解决该问题的最佳方法,还是只应使用字典?