python:按名称分配属性值

时间:2017-02-09 11:30:24

标签: python python-3.x self

作为python3中更大项目的一部分,我需要一种方法,本着以下(不工作)代码的精神:

class Qclass:
     def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

def increment(Q, var):
    eval('Q.{} = Q.{} + 100'.format(var,var))

Q = Qclass(1,2,3)
increment(Q,'a')
print(Q.a)
>>> 101

我需要这个,因为我不知道Q的哪个属性必须递增。一个解决方案是为每个属性声明特定的函数并使用一些选择器,但我希望尽可能避免这种情况。

有一种整洁的方法吗?

3 个答案:

答案 0 :(得分:3)

使用eval(..) <几乎在任何情况下都是非常糟糕的主意。您可以使用更安全的getattr(..)setattr(..)

def increment(Q, var):
    setattr(Q,var,getattr(Q,var)+100)

getattr(obj,name)setattr(obj,name,val)获取并设置obj等属性。因此,如果您事先不知道名称,可以在此处获取/设置属性。

结果代码是:

class Qclass:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

def increment(Q, var):
    setattr(Q,var,getattr(Q,var)+100)

Q = Qclass(1,2,3)
increment(Q,'a')
print(Q.a)

答案 1 :(得分:0)

setattrgetattr的组合可以:

def increment(Q, var):
    setattr(Q, var, getattr(Q, var) + 100)

在代码段执行后101产生Q.a

getattr只是通过给定名称从对象中获取属性(如果该属性不存在,则允许使用默认值);类似于Q.<val_name>

setattr执行赋值,在对象上设置具有给定名称的属性。

答案 2 :(得分:0)

您可以使用内置函数vars,该函数返回在给定范围内声明的变量字典。它的用法如下:

Q = Qclass(1,2,3)
try:
    vars(Q)['a'] += 1
except KeyError:
    Q.a = 1