0

我有这样的课:

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

Rank有很多属性(第一个是respect)。

的属性名称Rank存储在list, 中attributes

我想遍历它们,将它们设置为somevalue任意变量。

我正在尝试:

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

4 回答 4

3

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

rank=Rank()
for att in attributes:
     setattr(rank, att, somevalue)
于 2013-09-04T17:44:01.813 回答
0

您可以使用*argsor**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)
于 2013-09-04T17:43:20.450 回答
0

您可以使用向对象注入属性setattr

for att in attributes:
    setattr(classobj, att.name, att.value)

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

稍后添加属性或方法可能会起作用,也可能不起作用,这取决于元类中使用了哪种魔法。

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

于 2013-09-04T17:46:59.230 回答
0

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

你能做的,我认为这就是你想要的,是使用getattrsetattr

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

*我知道相信 Python 有一些其他调用约定的教派。这不是一回事。

于 2013-09-04T17:47:03.543 回答