python:按名称分配属性值

标签 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 的哪个属性必须增加。一个解决方案是为每个属性声明特定的函数并使用一些选择器,但如果可能的话我宁愿避免这种情况。

有没有一种简洁的方法可以做到这一点?

最佳答案

使用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/

相关文章:

python - 如何在 ipython 控制台中定义类输出

java - 如何使用 XMLStreamWriter 编写自闭合元素标签

python - 如何多次动态调用命令的子命令?

python - Python类之间如何通信?

python-3.x - 仅在值不为空或不是空字符串的行上应用 UDF 未按预期工作

javascript - jQuery:将函数 self 添加到数组?

php - 当使用 !(self::$_instance instanceof self) 为什么这不起作用

python - 如何在 Cython 中构建 iostream 对象(例如 cout)并将其传递给 C++ 函数?

python - Python Pandas 的 LaTeX 输出中的 Midrule

python - 属性错误 : 'DataFrame' object has no attribute 'map'