python:按名称分配属性值
作为python3中一个更大项目的一部分,我需要一个符合以下(不工作)代码精神的方法: 我需要这个,因为我不知道Q的哪个属性必须递增。一个解决方案是为每个属性声明特定的函数并使用一些选择器,但如果可能的话,我宁愿避免这种情况 有没有一种整洁的方法可以做到这一点?和的组合可以做到:python:按名称分配属性值,python,python-3.x,self,Python,Python 3.x,Self,作为python3中一个更大项目的一部分,我需要一个符合以下(不工作)代码精神的方法: 我需要这个,因为我不知道Q的哪个属性必须递增。一个解决方案是为每个属性声明特定的函数并使用一些选择器,但如果可能的话,我宁愿避免这种情况 有没有一种整洁的方法可以做到这一点?和的组合可以做到: def increment(Q, var): setattr(Q, var, getattr(Q, var) + 100) 执行代码段后,为Q.a生成101 getattr只需从对象中按给定名称获取属性(如果
def increment(Q, var):
setattr(Q, var, getattr(Q, var) + 100)
执行代码段后,为Q.a
生成101
getattr
只需从对象中按给定名称获取属性(如果属性不存在,则允许使用默认值);类似于Q.
setattr
执行赋值,在对象上设置具有给定名称的属性。您可以使用内置函数,该函数返回给定范围内声明的变量字典。它的用法如下所示:
Q = Qclass(1,2,3)
try:
vars(Q)['a'] += 1
except KeyError:
Q.a = 1
使用
eval(…)
(在几乎任何上下文中)是一个非常糟糕的想法。您可以使用更安全的getattr(..)
和setattr(..)
:
def increment(Q, var):
setattr(Q,var,getattr(Q,var)+100)
getattr(obj,name)
和setattr(obj,name,val)
获取并设置obj
ect的属性。因此,如果您事先不知道名称,您可以在这里获取/设置属性
因此产生的代码是:
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)
啊,是的!我完全忘记了setattr()getattr()。谢谢尽管您编辑了我的问题,将def increment()放入了Qclass中?“我的意思是要从根本上解决这个问题。”阿德拉姆:啊,不是这样吗?缩进肯定有问题,因为
\uuuuu init\uuuu
与类
处于同一缩进中。对不起,输入错误。现在一切都是正确的:)巧妙的方法,不知道vars()。作为记录,我已经用setattr(Q,var,getattr(Q,var)+1)对这个解决方案进行了基准测试。似乎它们在计算时间方面非常接近相等。感谢此方法仅适用于具有\uu dict\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
的类,对于没有(例如,使用Q.uu dict_uu['a']+=1
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)