【问题标题】:How to target a specific instance of a class from a string variable如何从字符串变量中定位类的特定实例
【发布时间】:2019-06-20 21:35:51
【问题描述】:

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

我已经向我的一位程序员朋友寻求帮助,但他专攻 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"

仅知道MysteryCar 中存储的内容是否可以返回值"Jon Arbuckle"

【问题讨论】:

  • 这就是字典的用途。
  • 字典或locals()/globals() 无论如何都是字典

标签: python python-3.x oop


【解决方案1】:

使用locals() 这是你本地范围的变量名称(作为字符串)的字典,作为它的键和它们的值......以及它的值!

print(locals()[MysteryCar].Owner)

另一种选择是使用eval,这是一种将字符串评估为python代码的方法。所以你可以这样做:

print(eval(MysteryCar).Owner)

但总的来说,eval 被认为是有风险的,在我看来应该避免......

例如,如果您的MysteryCar 是来自用户的输入,如果用户输入一些危险的命令可能会导致严重问题。

另一方面,使用locals,您可以使用try/except KeyError让用户知道他的选择是否错误

【讨论】:

    【解决方案2】:

    你的朋友是对的。您可以使用exec 运行一些您使用MysteryCar 指向的字符串定义的Python 代码。我喜欢 f-strings (Python 3.6+),但你也可以用其他方式格式化你的强:

    >>> command = f"car_owner = {MysteryCar}.Owner"
    >>> exec(command)
    >>> print(car_owner)
    Jon Arbuckle
    

    MysteryCar 将在 f 字符串中计算为 Car1,因此您正在执行命令

    car_owner = Car1.Owner
    

    上面。

    然而,正如一些 cmets 指出的那样,我会质疑这是否是解决问题的最佳方法,或者您是否应该只使用字典。

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多