python:将变量的值而不是其名称发送到函数

时间:2013-09-04 17:39:59

标签: python django function class attributes

我有一个这样的课程:

class Rank (models.Model):
      respect=models.IntegerField(max_length=3)
      #some other attributes

Rank有许多属性(第一个属于respect)。

Rank的属性名称存储在listattributes中。

我想迭代它们,将它们设置为somevalue,一个任意变量。

我正在尝试:

rank=Rank()
for att in attributes:
     rank.att=somevalue #I want rank.(value of att) instead of this

4 个答案:

答案 0 :(得分:3)

我认为你要做的是按名称为属性设置一个值。这就是setattr内置的方法。

rank=Rank()
for att in attributes:
     setattr(rank, att, somevalue)

答案 1 :(得分:0)

您可以使用*args**kwargs通配符参数。请尝试以下方法查看其工作原理:

def foo(*args, **kwargs):
    print args
    print kwargs

foo(1,2,3)
foo(a=1,b=2,c=3)
foo(1,2,z=3)

答案 2 :(得分:0)

您可以使用setattr

将属性注入对象
for att in attributes:
    setattr(classobj, att.name, att.value)

但请注意,这可能有效,因为该类可能基于在创建类对象时检查属性的元类。

以后添加属性或方法可能有效或无效,具体取决于元类中使用的魔法类型。

如果类想要在创建时检查属性,那么唯一的解决方案(不会弄乱类特定的魔法)就是使用字符串的eval

答案 3 :(得分:0)

通常,您不能将变量的名称传递给函数 - python仅按值调用*

您可以做什么,我认为这就是您想要的,使用getattrsetattr

for att in attributes:
     print getattr(rank, att)
     setattr(rank, att, somevalue)

*我知道那个认为Python有其他调用约定的教派。这不是一件事。