在自定义类中实现 __next__

met*_*eto 4 python class

我有一堂课看起来像这样

Class myClass:

    def __init__(self, key, value):
        self.key = key
        self.value = value
Run Code Online (Sandbox Code Playgroud)

其中key是一个字符串,并且value始终是 myClass 的元素列表,可能为空。

我想定义我自己的 iter 方法,该方法返回value.key每个valuein values。我试过

def __iter__(self):
    return self 

def __next__(self):
    try:
        self.value.next().key
    except:
        raise StopIteration
Run Code Online (Sandbox Code Playgroud)

但它永远循环。我究竟做错了什么?另外,如果我想具有 Python 2 / 3 兼容性,我应该添加该方法吗

def next(self):
    return self.__next__()
Run Code Online (Sandbox Code Playgroud)

Dun*_*nes 5

你没有理由去实施__next__. 您可以使用__iter__返回一个生成器来执行您想要的操作。

class Pair(object):

    def __init__(self, key, value):
        self.key = key
        self.value = value

    def __iter__(self):
        return (v.key for v in self.value)

    # alternative iter function, that allows more complicated logic
    def __iter__(self):
        for v in self.value:
             yield v.key

p = Pair("parent", [Pair("child0", "value0"), Pair("child1", "value1")])

assert list(p) == ["child0", "child1"]
Run Code Online (Sandbox Code Playgroud)

这种处理方式与 python2 和 python3 兼容,因为返回的生成器将具有nextpython2 和__next__python3 中所需的函数。