Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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_Django_Function_Class_Attributes - Fatal编程技术网

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}
我认为。但网站不允许我将你的答案设置为正确答案,但网站不允许我将你的答案设置为正确答案