Как назначить предоставленный пользователем аргумент атрибуту python, если этот атрибут является самим классом - PullRequest
0 голосов
/ 17 мая 2018

Возможно, я делаю все это совершенно неправильно, но я программист Google Python, так что вот что.

У меня есть созданный класс с именем "create", который создает объект.Свойства этого объекта являются экземплярами другого класса (настроек)

class setting:
   def __init__(self,name,value,IsRequired):
       self.name=name
       self.IsRequired=IsRequired
      self.value=value

class create:
filter=setting("filter","filter_name",True)   
consumer=setting("consumer","","True")
def __init__(self, name):
    self.name=name


>>>a=create("test")
>>>a.name
'test'
>>> a.filter.IsRequired
True
>>> a.filter.value
'filter_name'

Это позволяет мне вызывать сложные свойства каждого из моих параметров настройки объекта в отдельности.Например, посмотрите, требуется ли настройка (фильтр) для выполнения, проверив a.filter.IsRequired

Для настройки параметров, в частности, «значение», я беру ввод от пользователя.
Я могу сослатьсяобщий объект со строкой с помощью eval.

>>>one="a"
>>>eval(one).filter.IsRequired
True
>>>eval(one).filter.value="NewValue"
>>>a.filter.value
'NewValue'

Теперь проблема.Я пытаюсь изменить «фильтр» на основе предоставленного пользователем ввода.

var1="a"
var2="filter"
>>> eval(var1).eval(var2).value
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: create instance has no attribute 'eval'

Как я могу назначить пользовательскую переменную для «значения» «фильтра» в этом примере?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

За исключением вашего странного стиля класса (вы должны читать о наследовании классов в Python), вы не должны использовать eval() почти для всего (читайте Eval действительно опасен ) - если вам нужен доступ к использование переменной по имени из глобального пространства имен globals():

var1 = "a"
a_value = globals()[var1]

Во-вторых, если вы хотите получить доступ к атрибуту объекта по имени, используйте getattr(), поэтому:

var1 = "a"
var2 = "filter"
a_filter_value = getattr(globals()[var1], var2).value
0 голосов
/ 17 мая 2018

Что вы подразумеваете под eval(var1).eval(var2).value:

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