作为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的哪个属性必须递增。一个解决方案是为每个属性声明特定的函数并使用一些选择器,但我希望尽可能避免这种情况。
有一种整洁的方法吗?
答案 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)
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