Fib實例雖然能作用于for循環,看起來和list有點像,但是,把它當成list來使用還是不行,比如,取第5個元素:
>>> Fib()[5]Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'Fib' object does not support indexing
要表現得像list那樣按照下標取出元素,需要實現__getitem__()方法:
class Fib(object): def __getitem__(self, n): a, b = 1, 1 for x in range(n): a, b = b, a + b return a
現在,就可以按下標訪問數列的任意一項了:
>>> f = Fib()>>> f[0]1>>> f[1]1>>> f[2]2>>> f[3]3>>> f[10]89>>> f[100]573147844013817084101
slice對象與__getitem__
想要使類的實例像列表一樣使用下標, 可以設置__getitem__方法。比如:
class _List(object): def __getitem__(self, key): print keyl = _List()l[3] # print 3
但是如果想要使用切片操作的
l[1:4] # print slice(1, 4, None)
會創建一個slice對象用于切片, 可以通過help(slice)查看具體操作。
a = slice(1, 4, None)range(5)[a] # print [1, 2, 3]
更加豐富的操作
class _List(object): def __init__(self, _list): self._list = _list def __getitem__(self, key): if isinstance(key, int): return self._list[key] elif isinstance(key, slice): reutrn self.__class__(self._list[key])if __name__ == '__main__': c = _List(range(10)) b = c[1:5] print b[3] # print 4
如果key是一個整形的話就返回列表元素,如果是一個slice對象的話,就創建一個實例并返回。
新聞熱點
疑難解答
圖片精選