Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:按名称分配属性值_Python_Python 3.x_Self - Fatal编程技术网

python:按名称分配属性值

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只需从对象中按给定名称获取属性(如果

作为python3中一个更大项目的一部分,我需要一个符合以下(不工作)代码精神的方法:

我需要这个,因为我不知道Q的哪个属性必须递增。一个解决方案是为每个属性声明特定的函数并使用一些选择器,但如果可能的话,我宁愿避免这种情况

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

和的组合可以做到:

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)