【问题标题】:Instantiating a class with an arbitrary number of attributes实例化具有任意数量属性的类
【发布时间】:2013-01-10 17:41:45
【问题描述】:

这个问题专门针对这里的 Python 类,但可以更笼统。我正在创建一个类m,它将使用四个变量进行初始化,然后我想将它们分配给该类的实例化。现在,它看起来像这样:

class mm(object):
  def __init__(self, a, b, c, r):
    self.a = a
    self.b = b
    self.c = c
    self.r = r
  # etc.

但是,我希望能够在一行中将变量分配给self,类似于伪代码:

def __init__(self, a, b, c, r):
  self.varname = var for var in [a, b, c, r]

如果这可以推广到任意数量的变量会更好,这样你就可以得到类似的东西:

def __init__(self, **kwargs):
  assign(self, varname, value) for varname, value in kwargs.iteritems()

但是,据我所知,这样的语句实际上是不可能循环的。有谁知道这样做的方法吗?

【问题讨论】:

  • 如果您真的非常想在一行中完成,您可以将setattrmap 结合使用(在您的**kwargs 示例中,_ = map(lambda (a, v): setattr(self, str(a), v), kwargs.items())),但我会从下面的无名中使用相同的两条线:)
  • @RocketDonkey 这是一个很棒的班轮。
  • @MikeVella Ha,谢谢(尽管为了其他人阅读我的代码,我可能永远不会使用它:))。

标签: python class variables variable-assignment


【解决方案1】:

您还可以使用实例的命名空间字典进行批量分配:

class mm(object):
    def __init__(self, **kwargs):
       self.__dict__.update(kwargs)

【讨论】:

  • 你真的不应该这样做。双下划线表示“dict”应该被视为私有的。
  • @MikeVella:两边带双下划线的属性名表示special attributes,不是私有的。左侧带有双反斜线但右侧没有的属性名称会强制名称修改。尽管这些名称被视为定义它们的类的private names,但它们在 Java/C++/C# 意义上并不是私有的。
  • @MikeVella:另外,请关注this link 看看谁想出了 thikonom 展示的内容。
  • @pillmuncher 关于两边的双下划线很公平。虽然我仍然认为这对于这种情况来说是一个非常糟糕的解决方案 - 在您发送给我的代码配方中,它强调这仅对于微不足道的“一堆”类是合理的。
【解决方案2】:

你可以使用setattr:

class mm(object):
    def __init__(self, **kwargs):
        for varname, value in kwargs.iteritems():
            setattr(self, varname, value)

【讨论】:

  • 谢谢,正是我想要的。
猜你喜欢
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2022-06-14
  • 2011-12-15
相关资源
最近更新 更多