python:将变量的值而不是名称发送给函数
我有一门课是这样的:python:将变量的值而不是名称发送给函数,python,django,function,class,attributes,Python,Django,Function,Class,Attributes,我有一门课是这样的: class Rank (models.Model): respect=models.IntegerField(max_length=3) #some other attributes Rank有许多属性(第一个是尊重) 等级的属性名称存储在列表,属性中 我想遍历它们,将它们设置为somevalue,这是一个任意变量 我正在尝试: rank=Rank() for att in attributes: rank.att=somevalue #
class Rank (models.Model):
respect=models.IntegerField(max_length=3)
#some other attributes
Rank
有许多属性(第一个是尊重
)
等级
的属性名称存储在列表
,属性
中
我想遍历它们,将它们设置为somevalue
,这是一个任意变量
我正在尝试:
rank=Rank()
for att in attributes:
rank.att=somevalue #I want rank.(value of att) instead of this
您可以使用
*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)
您可以使用
*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)
我认为您要做的是通过名称为属性设置一个值。这就是setattr内置方法的用途
rank=Rank()
for att in attributes:
setattr(rank, att, somevalue)
我认为您要做的是通过名称为属性设置一个值。这就是setattr内置方法的用途
rank=Rank()
for att in attributes:
setattr(rank, att, somevalue)
您可以使用
setattr
for att in attributes:
setattr(classobj, att.name, att.value)
但是请注意,这可能有效,也可能无效,因为该类可能基于元类,该元类在创建类对象时检查属性
稍后添加属性或方法可能有效,也可能无效,这取决于元类中使用了何种魔法
如果类希望在创建时检查属性,唯一的解决方案(不影响特定于类的魔法)是使用字符串的
eval
。您可以使用setattr
for att in attributes:
setattr(classobj, att.name, att.value)
但是请注意,这可能有效,也可能无效,因为该类可能基于元类,该元类在创建类对象时检查属性
稍后添加属性或方法可能有效,也可能无效,这取决于元类中使用了何种魔法
如果类希望在创建时检查属性,唯一的解决方案(不影响特定于类的魔力)是使用字符串的
eval
。一般来说,您不能将变量的名称传递给函数-python只通过值调用*
你能做的,我想这就是你想要的,就是使用getattr
和setattr
:
for att in attributes:
print getattr(rank, att)
setattr(rank, att, somevalue)
*
我知道有一个教派认为Python还有其他一些调用约定。这不是一件事。一般来说,您不能将变量的名称传递给函数-python只是通过值调用的*
你能做的,我想这就是你想要的,就是使用getattr
和setattr
:
for att in attributes:
print getattr(rank, att)
setattr(rank, att, somevalue)
*
我知道有一个教派认为Python还有其他一些调用约定。这不是一件事。您试图将变量的值发送给哪个函数而不是变量名?类构造函数如果查看代码,您会发现您的问题有点误导。Python使用按引用传递,而按值传递的唯一方法是使用对象的深度副本(这非常低效)。此外,除了init之外,我在您的代码中甚至看不到任何函数。@ShashankGupta不,python不使用按引用传递。如果是的话,这个问题会有一些意义。他希望rank.att
实际上是指rank.{value\u of_att}
我想。你想把变量的值发送给哪个函数而不是变量名?类构造函数如果你看代码,你会发现你的问题有点误导。Python使用按引用传递,而按值传递的唯一方法是使用对象的深度副本(这非常低效)。此外,除了init之外,我在您的代码中甚至看不到任何函数。@ShashankGupta不,python不使用按引用传递。如果是这样的话,这个问题会有一定的意义。他希望rank.att
实际上是指rank.{value\u of_att}
我认为。但网站不允许我将你的答案设置为正确答案,但网站不允许我将你的答案设置为正确答案