2024-05-23 17:53:06 发布
网友
我在寻找一个类的最小示例,该类模仿Python中不可变的序列。在
class MySequence() ... a = MySequence() len(a) for i in a: pass a[0]
必须实现哪些方法?在
如果您只想迭代序列,只需实现返回iterable的__iter__方法。最简单的方法是使用yield语句创建一个生成器。在
__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__。在
MySequence()[1]
__getitem__
__len__
注意,我省略了__iter__。只要__getitem__在试图获得一个超出边界的值时引发一个IndexError,Python就可以使用它进行迭代。(如果我想更清楚,或者想要非标准的迭代行为,我仍然可以包括__iter__)
IndexError
添加到@Jeremy的答案:一个流行的检查值是一个通用序列的方法是使用isinstance(value, collections.Sequence)。在
isinstance(value, collections.Sequence)
为了使您的类型实现这一点,它需要从^{}继承,这实际上为混合函数提供了迭代器(和一些其他有用的函数),只要您提供__len__和__index__函数。在
__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()
用法示例:
如果您只想迭代序列,只需实现返回iterable的
__iter__
方法。最简单的方法是使用yield
语句创建一个生成器。在但是,这不会启用
^{pr2}$MySequence()[1]
之类的功能。为此,您需要实现__getitem__
方法,并且可能还应该实现__len__
。在注意,我省略了
__iter__
。只要__getitem__
在试图获得一个超出边界的值时引发一个IndexError
,Python就可以使用它进行迭代。(如果我想更清楚,或者想要非标准的迭代行为,我仍然可以包括__iter__
)添加到@Jeremy的答案:一个流行的检查值是一个通用序列的方法是使用
isinstance(value, collections.Sequence)
。在为了使您的类型实现这一点,它需要从^{} 继承,这实际上为混合函数提供了迭代器(和一些其他有用的函数),只要您提供
__len__
和__index__
函数。在借用@Jeremy的答案,一个示例类如下所示:
用法示例:
^{pr2}$相关问题 更多 >
编程相关推荐