Python 使用eval设置未知属性

Python 使用eval设置未知属性,python,eval,Python,Eval,我有一个用户类,里面有多个属性,我还有一个用户类的addPoint方法,它允许用户将点输入到它的任何属性中。但是,最多可以有500个属性,每个人都可以有不同的属性,等等。因此,用“if:-elif:”对每个属性进行编码将是一件痛苦的事情。现在,这就是我试图做的,使它更容易和更干净: class User: def __init__(self): self.health = 0 self.speed = 0 def addPoint(self, p

我有一个用户类,里面有多个属性,我还有一个用户类的addPoint方法,它允许用户将点输入到它的任何属性中。但是,最多可以有500个属性,每个人都可以有不同的属性,等等。因此,用“if:-elif:”对每个属性进行编码将是一件痛苦的事情。现在,这就是我试图做的,使它更容易和更干净:

class User:
    def __init__(self):
        self.health = 0
        self.speed = 0

    def addPoint(self, property, amount):
        eval("self."+property) = eval("self."+property) + amount
现在我要做fe

u = User()
u.addPoint("health", 5)
我希望它能这样做:
self.health=self.health+5
,这就是我使用
eval()
的目的。然而,Python只是给了我一个错误:
不能分配给函数调用
。我不是试图分配
eval()
函数调用本身,我是试图分配
eval()
返回的值,那么我如何才能最简单地做到这一点呢?

不要使用
eval()
,而是使用和:


使用
字典
而不是
eval()


使用Python标准库提供的函数settattr-快速示例:

>>> class A:
...     def __init__(self):
...         setattr(self, "a", "b")
... 
>>> A().a
'b'

我不确定这是否是最佳解决方案,但您可以使用对象的dict属性,如下所示:

def addPoint(self, property, amount):
    self.__dict__[property] = amount

\uuuu dict\uuuuu
属性存储对象的所有属性,您可以以非常干净和简单的方式访问它们。

至于错误:如果您仔细想想,您的示例将计算为
0=0+5
,因为第7行中的
eval
返回一个值,不是指针或引文。Martijn Pieters在他的文章中已经提到了这一点。谢谢,先生,效果更好,会尽快接受:)注意,通过转到实例
\uu dict\uuu
您可能会绕过
@property
方法。
>>> class A:
...     def __init__(self):
...         setattr(self, "a", "b")
... 
>>> A().a
'b'
def addPoint(self, property, amount):
    self.__dict__[property] = amount