每个循环调用python list __iter__方法?

scr*_*Dog 9 python iterator loops python-2.6

我正在尝试创建一个继承自python列表的类.我希望列表的每个循环初始化/最终确定列表的元素.我认为这可以通过覆盖__iter__python列表的方法来完成,但我似乎无法让它工作.该__iter__方法似乎只调用一次?(见下文)

class MyList(list):
    def __iter__(self):
        print 'do something'
        return list.__iter__(self)

my_list = MyList(range(10))
print my_list

for item in my_list:
    print item
Run Code Online (Sandbox Code Playgroud)

产量

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
do something
0
1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

知道如何实现我想做的事吗?

Joh*_*ooy 11

您只需从中返回生成器表达式即可 __iter__()

class MyList(list):
    def __iter__(self):
        return (self.do_something(x) for x in list.__iter__(self))

    def do_something(self, x):
        print 'do something', x
        return x

my_list = MyList(range(10))
print my_list

for item in my_list:
    print item
Run Code Online (Sandbox Code Playgroud)

ncoghlan建议使用生成器代替生成器表达式,以便于调试

class MyList(list):

    def __iter__(self):
        for x in list.__iter__(self):
            yield self.do_something(x)

    def do_something(self, x):
        print 'do something', x
        return x

my_list = MyList(range(10))
print my_list

for item in my_list:
    print item
Run Code Online (Sandbox Code Playgroud)

或者你可以在这里使用imap

from itertools import imap

class MyList(list):
    def __iter__(self):
        return imap(self.do_something, list.__iter__(self))

    def do_something(self, x):
        print 'do something', x
        return x


my_list = MyList(range(10))
print my_list

for item in my_list:
    print item
Run Code Online (Sandbox Code Playgroud)


Cat*_*lus 4

__iter__返回一个迭代器对象。如果您需要在每次迭代中执行某些操作,则必须实现自己的(它必须实现链接文档中描述的两种方法)。