当该属性是类本身时,如何为python属性分配用户提供的参数

时间:2018-05-17 00:42:12

标签: python python-2.7

我可能完全错了,但我是一个google taugh 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 :(得分:0)

eval(var1).eval(var2).value的意思是:

getattr(eval(var1), var2).value

答案 1 :(得分:0)

除了你的奇怪的类风格(你应该阅读Python中的类继承),你不应该使用eval()几乎任何东西(阅读Eval really is dangerous) - 如果你需要按名称访问变量从全局命名空间使用globals()

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

其次,如果要按名称访问对象的属性,请使用getattr(),所以:

var1 = "a"
var2 = "filter"
a_filter_value = getattr(globals()[var1], var2).value