如何从字符串变量中指定类的特定实例

时间:2019-06-20 21:35:51

标签: python python-3.x oop

我有一个程序,我需要从一个字符串变量中获取类的多个实例之一的信息。

我已经向我的一个程序员朋友寻求帮助,但是他专门研究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的原因?

2 个答案:

答案 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

上方。

但是,正如一些评论所指出的那样,我会怀疑这是否是解决该问题的最佳方法,还是只应使用字典?