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>

 

转载于:https://www.cnblogs.com/chenlin163/p/7304935.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值