Как настроить таргетинг на конкретный экземпляр класса из строковой переменной - PullRequest
2 голосов
/ 21 июня 2019

У меня есть программа, в которой мне нужно получить информацию из одного из множества экземпляров класса только из строковой переменной.

Я попросил помощи у моего друга-программиста, но он специализируется скорее на 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 ]

5 голосов
/ 21 июня 2019

с использованием locals(), который является диктовкой имен переменных локальной области видимости (в виде строк) в качестве его ключей и их значений в качестве ..... а также его значений!

print(locals()[MysteryCar].Owner)

Другой альтернативой может быть использование eval, который является методом, который оценивает строку как код Python. Таким образом, вы можете сделать что-то вроде:

print(eval(MysteryCar).Owner)

Но в целом eval считается рискованным и его следует избегать, на мой взгляд ...

Например, если ваш MysteryCar является вводом пользователя, который может привести к серьезным проблемам, если пользователь введет какую-нибудь опасную команду.

С другой стороны, используя locals, вы можете сообщить пользователю, если его выбор неверен, используя try/except KeyError

2 голосов
/ 21 июня 2019

Ваш друг прав.Вы можете использовать exec для запуска некоторого кода Python, который вы определяете, используя строку, на которую указывает MysteryCar.Мне нравятся f-строки (Python 3.6+), но вы можете также отформатировать ваш сильный вариант:

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

MysteryCar оценивается как Car1 внутри f-строки, так что выВыполнение команды

car_owner = Car1.Owner

выше.

Как отмечалось в некоторых комментариях, я хотел бы спросить, является ли это лучшим решением проблемы, или вам следует просто использовать словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...