如何在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__
如果我想更清楚,或者想要非标准的迭代行为,我仍然可以包括在内。)