Python类动态属性访问

时间:2016-01-16 20:01:50

标签: python dynamic attributes eval

我想通过名称来访问一个类属性。

类似的东西:

class a:
    b=[]

c='b'
eval('a.'+c+'=1')

但这在Python中并不起作用。 我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

使用setattr

In [1]: class a:
   ...:     b = []
   ...:     

In [2]: setattr(a, 'b', 1)

In [3]: a.b
Out[3]: 1

反向使用getattr

In [4]: getattr(a, 'b')
Out[4]: 1

In [5]: getattr(a, 'x', 'default')
Out[5]: 'default'
但是,我非常怀疑,有一种更好的方法来实现你的目标。您是否尝试使用字典而不是类?

答案 1 :(得分:1)

eval用于评估,使用exec来“执行”语句:

exec('a.'+c+'=1')

然而,考虑使用both的风险。您可以查看this answer表达式和语句之间的区别。

由于您希望按名称设置属性,hop's answer中解释的setattr是一种更好的做法,比使用exec更安全。