作为 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 的哪个属性必须增加。一个解决方案是为每个属性声明特定的函数并使用一些选择器,但如果可能的话我宁愿避免这种情况。
有没有一种简洁的方法可以做到这一点?
最佳答案
使用eval(..)
(几乎在任何情况下)都是一个非常糟糕的主意。您可以使用更安全的 getattr(..)
和 setattr(..)
:
def increment(Q, var):
setattr(Q,var,getattr(Q,var)+100)
getattr(obj,name)
和 setattr(obj,name,val)
获取和设置对象
对象的属性。因此,如果您事先不知道名称,则可以在这里获取/设置属性。
所以生成的代码是:
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)
关于python:按名称分配属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42135535/