如何使类对象可迭代

用户10200421

我有以下点类:

import math

class Point:
    """Two-Dimensional Point(x, y)"""
    def __init__(self, x=0, y=0):
        # Initialize the Point instance
        self.x = x
        self.y = y

   # def __iter__(self):
 #       return iter(int(self.x))
 #       return iter(int(self.y))
        return self

    @property
    def magnitude(self):
        # """Return the magnitude of vector from (0,0) to self."""
        return math.sqrt(self.x ** 2 + self.y ** 2)


    def distance(self, self2):
         return math.sqrt((self2.x - self.x) ** 2 + (self2.y - self.y) ** 2)

    def __str__(self):
        return 'Point at ({}, {})'.format(self.x, self.y)

    def __repr__(self):
        return "Point(x={},y={})".format(self.x, self.y)

我想让“点”可迭代,以便以下是可能的:

point = Point(2, 3)
x, y = point
print(x)
    2
print(y)
    3

如果你看到我的注释代码,这就是我尝试的,但它说 TypeError: iter() 返回了类型为“Point”的非迭代器。关于如何正确执行此操作的任何想法?

阿巴纳特

tl;博士:

def __iter__(self):
    yield self.x
    yield self.y

为了使某些东西可迭代,你需要你的__iter__方法来返回一个迭代器。

你不能只是return self, 除非self已经是一个迭代器(这意味着它有一个__next__方法)。但是你不想points成为一个迭代器,你希望它可以一遍又一遍地迭代。

return iter(int(self.x))那么你不能return iter(int(self.y)),有两个原因。首先,在你之后return,你的功能就完成了;之后发生的任何代码都不会运行。其次,你可以不叫iterint(此外,还有没有理由骂intint。)


您可以通过从 each 创建一个可迭代对象来解决最后一组问题int,例如单元素列表,迭代该可迭代对象,然后使用yield from代替委托给它return在函数中使用yieldoryield from使其成为生成器函数,生成函数创建的生成器是迭代器:

yield from iter([self.x])
yield from iter([self.y])

……但这有点傻。一旦我们知道我们想要一个生成器,我们就可以只yield迭代我们想要迭代的值。因此,顶部的代码。


或者,您可以为两个元素显式创建一个单元素可迭代对象并将它们链接在一起并返回:

def __iter__(self):
    return itertools.chain(iter([self.x]), iter([self.y]))

但这也很愚蠢。在单元素列表上链接两个迭代器与仅迭代一个双元素列表相同:

def __iter__(self):
    return iter([self.x, self.y])

最后,与其依赖于chainPython 自带的生成器、列表迭代器、或其他迭代器类型,您始终可以明确地编写一个:

class PointIterator:
    def __init__(self, point):
        self.values = [point.x, point.y]
    def __next__(self):
        try:
            return self.values.pop(0)
        except IndexError:
            raise StopIteration
    def __iter__(self):
        return self

class Point:
    # ... other code
    def __iter__(self):
        return PointIterator(self)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

打字稿:使类对象可迭代

如何检查可迭代对象的内容?

如何使自定义对象可迭代?

对象在 python 中不可迭代时创建使类可迭代对象

Python:使类可迭代

Python,如何创建与随机可迭代对象具有相同类型的可迭代对象

使对象可迭代?

如何使用每个对象来迭代类的对象

如何使保存为类中的属性的列表可迭代?

如何使用SWIG从Python使C ++类可迭代?

在Python中,如何确定对象是否可迭代?

如何计算可迭代对象的笛卡尔积

如何异步映射/过滤异步可迭代对象?

如何从异步函数返回惰性可迭代对象

如何在JavaScript中制作可迭代对象

我如何批量使用可迭代对象(大小相等的块)?

如何在 Dart 中使用括号创建可迭代对象?

如何让 Pydantic 从可迭代对象自动创建列表?

没有下一个对象如何迭代一个可迭代对象?

Python:过滤可迭代的类

对多个可迭代对象的列表理解迭代

使纯的对象可迭代。(JavaScript的)

如何使用迭代器在类中以可迭代的形式仅返回除以 3 的数字

C ++ /迭代器如何用于Set类对象?

如何使用对象迭代读取/获取扩展类的静态属性

Java类ArrayList如何返回迭代器对象?

如何使用itertools对python中具有不同长度的可迭代对象进行迭代?

如何只允许特定类的元素成为可迭代的元素(对于自定义类)

将熊猫系列转换为可迭代的可迭代对象