【问题标题】:python: send value of a variable instead of its name to functionpython:将变量的值而不是其名称发送给函数
【发布时间】:2013-09-04 17:39:58
【问题描述】:

我有这样的课程:

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

【问题讨论】:

  • 你试图将变量的值而不是变量名发送到哪个函数?
  • 类的构造函数看代码就知道了
  • 你的问题有点误导。 Python 使用按引用传递,按值传递的唯一方法是使用对象的深层副本(这非常低效)。此外,除了 init 之外,我什至没有在您的代码中看到任何函数。
  • @ShashankGupta 不,python 使用通过引用传递。如果是这样,这个问题就会有一定的意义。
  • 我认为他希望 rank.att 实际上是指 rank.{value_of_att}

标签: python django function class attributes


【解决方案1】:

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

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

【讨论】:

  • 但是网站不允许我将您的答案设置为正确答案
【解决方案2】:

您可以使用*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)

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 2019-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        相关资源
        最近更新 更多