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>

 

posted @ 2017-08-08 08:32  耳木东木2  阅读(182)  评论(0编辑  收藏  举报