通过使容器iterab解包实例变量

2024-04-29 14:15:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我不确定在实现我自己的__iter__方法时,哪种方法是正确的,但是后者是一种混合了“成功”的方法。我之所以说mixed,是因为使用呈现的代码这样做会改变原始实例对象x,因此它不再有效。在

^{pr2}$

我在这个网站上读过无数关于__iter____next__,生成器等的帖子,还有一本python的书和docs.python.org似乎无法理解我所不理解的。我发现__iter__需要返回一个iterable(它可以是self,但我不确定这是如何实现我想要的)。我也尝试过各种方法来实现__next__和迭代{},无论是通过转换到列表还是作为字典,都没有成功。在

我不相信这是一个重复的帖子,因为我看到的唯一类似的问题只呈现了一个列表序列对象属性,或者使用了一个数字范围而不是四个非容器变量。在


Tags: 对象实例方法代码nameorgdocs列表
2条回答

您可以将参数存储在属性(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()

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

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

有了这个变化

^{pr2}$

会给你变量。在


您可以使用更危险的方法使用vars(x)或{},按变量名对其进行排序(这就是为什么它也是一个有限的变量,变量不按顺序保存),然后提取每个元组的第二个元素。但我要说迭代器绝对是更好的。在

相关问题 更多 >