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

2024-05-23 17:53:06 发布

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

我在寻找一个类的最小示例,该类模仿Python中不可变的序列。在

class MySequence()
    ...

a = MySequence()

len(a)

for i in a:
    pass

a[0]

必须实现哪些方法?在


Tags: 方法in示例forlen序列passclass
2条回答

如果您只想迭代序列,只需实现返回iterable的__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__。在

^{pr2}$

注意,我省略了__iter__。只要__getitem__在试图获得一个超出边界的值时引发一个IndexError,Python就可以使用它进行迭代。(如果我想更清楚,或者想要非标准的迭代行为,我仍然可以包括__iter__

添加到@Jeremy的答案:一个流行的检查值是一个通用序列的方法是使用isinstance(value, collections.Sequence)。在

为了使您的类型实现这一点,它需要从^{}继承,这实际上为混合函数提供了迭代器(和一些其他有用的函数),只要您提供__len____index__函数。在

借用@Jeremy的答案,一个示例类如下所示:

import collections
class MySequence(collections.Sequence):
    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()

用法示例:

^{pr2}$

相关问题 更多 >