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