python--getitem一拦截索引运算
getitem一拦截索引运算
__getitem__方法拦截实例的索引运算。当实例x出现在x[i]这样的索引运算中时,Python会调用这个实例继承的__getitem__方法(如果有的话),把x作为第一个参数传递,并且方括号内的索引值传给第二个参数。例如,下面的类将返回索引值的平方。
#!/usr/bin/env python # -*- coding:utf-8 -*- class indexer: def __getitem__(self, item): return item **2 x = indexer() for i in range(5): print(x[i])
运行结果:
0 1 4 9 16
getitem__和__iter__实现迭代
初学者可能不见得马上就能领会这里的技巧,但这些技巧都是非常有用的。for语句的作用是从o到更大的索引值,重复对序列进行索引运算,直到检侧到超出边界的异常.因此,__getitem__也可以是Py,hon中一种重载迭代的方式。如果定义了这个方法,于。r循环每次循环时都会调用类的__geti大em--_,并持续搭配有更高的偏移值。这是一种“买一送一”的情况:任何会响应索引运算的内置或用户定义的对象,同样会响应迭代。
#!/usr/bin/env python # -*- coding:utf-8 -*- class stepper: def __getitem__(self, i): return self.data[i] x = stepper() x.data = "Spam" print(x[1]) for item in x: print(item, end=" ")
运行结果:
p S p a m
事实上,这其实是“买下送一”的情况。任何支持for循环的类也会自动支持Python所有迭代坏境,而其中多种迭代环境我们已看过,例如,成员关系测试in、列表解析、内置函数map、列表和元组赋值运算以及类型构造方法也会自动调用__getitem__(如果定义了的话)。
#!/usr/bin/env python # -*- coding:utf-8 -*- class stepper: def __getitem__(self, i): return self.data[i] x = stepper() x.data = "Spam" print(x[1]) for item in x: print(item, end=" ") print() print("---------------------------") print("p" in x) print([c for c in x]) print(list(map(lambda y : y,x))) print("---------------------------") (a,b,c,d) = x print(a,b,c,d) print(list(x), tuple(x), ''.join(x)) print(x)
运行结果:
p S p a m --------------------------- True ['S', 'p', 'a', 'm'] ['S', 'p', 'a', 'm'] --------------------------- S p a m ['S', 'p', 'a', 'm'] ('S', 'p', 'a', 'm') Spam <__main__.stepper object at 0x00000000022CC550>