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>