我有一个这样的课程:
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
答案 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仅按值调用*
您可以做什么,我认为这就是您想要的,使用getattr
和setattr
:
for att in attributes:
print getattr(rank, att)
setattr(rank, att, somevalue)
*
我知道那个认为Python有其他调用约定的教派。这不是一件事。