当前位置: 代码迷 >> python >> 通过使容器可迭代来解压缩实例变量
  详细解决方案

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

热度:41   发布时间:2023-06-16 14:13:18.0

我只想能够解压缩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() ,这些方法通过转换为列表或作为字典都没有成功。

我不认为这是重复的帖子,因为我所看到的唯一类似的问题是呈现单个列表序列对象属性或采用一定范围的数字而不是四个非容器变量。

如果需要实例的变量,则应使用.self访问:

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

有了这个改变,

a, b, c, d = list(x)

会给你变量。


您可以使用使用vars(x)x.__dict__风险更高的方法,按变量名称对其进行排序(这就是为什么它也是一个有限的变量,变量以无序保存的原因),然后提取第二个变量每个元组的元素。 但是我会说迭代器肯定更好。

您可以将参数存储在属性中(下面的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()
  相关解决方案