如何在Python中实现行为类似于序列的最小类?


问题内容

我正在寻找模仿Python中不可变序列的类的最小样本示例。

class MySequence()
    ...

a = MySequence()

len(a)

for i in a:
    pass

a[0]

必须实施哪些方法?


问题答案:

如果只想对序列进行迭代,则只需实现__iter__返回可迭代的方法即可。最简单的方法是使用该yield语句创建生成器。

class MySequence(object):
    def __iter__(self):
        yield 1
        yield 2
        yield 3

for x in MySequence():
    print x # prints 1, then 2, then 3

但是,这不会启用MySequence()[1]。为此,您需要实现该__getitem__方法,并且可能也应该实现__len__

class MySequence(object):
    def __len__(self):
        return 3

    def __getitem__(self, key):
        if key == 0:
            return 1
        elif key == 1:
            return 2
        elif key == 2:
            return 3
        else:
            raise IndexError()

s = new MySequence()

for i in range(len(s)):
    print s[i] # prints 1, then 2, then 3

for x in s:
    print x # prints 1, then 2, then 3

注意,我省略了__iter__。只要在尝试获取超出范围的值时__getitem__引发IndexError,Python便可以将其用于迭代。(__iter__如果我想更清楚,或者想要非标准的迭代行为,我仍然可以包括在内。)