通过使容器可迭代来解包实例变量

时间:2017-02-16 21:11:08

标签: python python-3.x instance-variables iterable iterable-unpacking

我只是希望能够解包类foo的实例变量,例如:

x = foo("name", "999", "24", "0.222")
a, b, c, d = *x
a, b, c, d = [*x]

我不确定在实现我自己的__iter__方法时这样做的正确方法是哪一种,但后者是使用混合"成功"的方法。我说混合是因为使用显示的代码这样做会改变原始实例对象x,使其不再有效。

class foo:
  def __init__(self, a, b, c, d):
    self.a = a
    self.b = b
    self.c = c
    self.d = d

  def __iter__(self):
    return iter([a, b, c, d])

我已阅读本网站上关于__iter____next__,生成器等的无数帖子,还有一本python书和docs.python.org,似乎无法弄清楚我不理解的内容。我已经收集到__iter__需要返回一个可迭代的东西(可能只是self,但我不确定这对我想要的是怎样的)。我还尝试了各种方法来实现__next__并迭代vars(foo).items(),无论是通过转换为列表还是作为字典,都没有成功。

我不相信这是一个重复的帖子,因为我见过的唯一类似问题是单个列表序列对象属性或使用一系列数字而不是四个非容器变量。

2 个答案:

答案 0 :(得分:1)

如果您想要实例的变量,则应使用*.dll

访问它们
.self

有了这个改变,

def __iter__(self):
    return iter([self.a, self.b, self.c, self.d])

将为您提供变量。

您可以使用更有风险的方法来使用a, b, c, d = list(x) vars(x),按变量名称对其进行排序(这就是为什么它也是有限的,变量以无顺序保存),并提取每个元组的第二个元素。但我会说迭代器肯定更好。

答案 1 :(得分:1)

您可以将参数存储在属性(下面的self.e)中,或者在函数调用中返回它们:

class foo:
  def __init__(self, *args):
    self.a, self.b, self.c, self.d = self.e = args

  def __call__(self):
    return self.e

x = foo("name", "999", "24", "0.222")
a, b, c, d = x.e
# or
a, b, c, d = x()