解析Python中的__getitem__专有方法


Posted in Python onJune 27, 2016

__getitem__
来看个简单的例子就明白:

def __getitem__(self, key): return self.data[key]
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")
>>> f
{'name':'/music/_singles/kairo.mp3'}
>>> f.__getitem__("name") 
'/music/_singles/kairo.mp3'
>>> f["name"] 
'/music/_singles/kairo.mp3'

(1)  __getitem__ 专用方法很简单。像普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。但是怎么调用它呢?哦,你可以直接调用 __getitem__,但是在实际中你其实不会那样做:我在这里执行它只是要告诉你它是如何工作的。正确地使用 __getitem__ 的方法是让 Python 来替你调用。
(2)  这个看上去就像你用来得到一个字典值的语法,事实上它返回你期望的值。下面是隐藏起来的一个环节:暗地里Python 已经将这个语法转化为 f.__getitem__("name") 的方法调用。这就是为什么 __getitem__ 是一个专用类方法的原因,不仅仅是你可以自已调用它,还可以通过使用正确的语法让 Python 来替你调用。

使用slice切片对象
list有个神奇的切片方法:

>>> range(100)[5:10]
[5, 6, 7, 8, 9]

对于Fib却报错。原因是__getitem__()传入的参数可能是一个int,也可能是一个切片对象slice,所以要做判断:

class Fib(object):
 def __getitem__(self, n):
 if isinstance(n, int):
 a, b = 1, 1
 for x in range(n):
 a, b = b, a + b
 return a
 if isinstance(n, slice):
 start = n.start
 stop = n.stop
 a, b = 1, 1
 L = []
 for x in range(stop):
 if x >= start:
 L.append(a)
 a, b = b, a + b
 return L

现在试试Fib的切片:

>>> f = Fib()
>>> f[0:5]
[1, 1, 2, 3, 5]
>>> f[:10]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

但是没有对step参数作处理:

>>> f[:10:2]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

也没有对负数作处理,所以,要正确实现一个__getitem__()还是有很多工作要做的。

此外,如果把对象看成dict,__getitem__()的参数也可能是一个可以作key的object,例如str。

与之对应的是__setitem__()方法,把对象视作list或dict来对集合赋值。最后,还有一个__delitem__()方法,用于删除某个元素。

总之,通过上面的方法,我们自己定义的类表现得和Python自带的list、tuple、dict没什么区别,这完全归功于动态语言的“鸭子类型”,不需要强制继承某个接口。

Python 相关文章推荐
跟老齐学Python之有点简约的元组
Sep 24 Python
利用Python演示数型数据结构的教程
Apr 03 Python
Python冒泡排序注意要点实例详解
Sep 09 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
获取python的list中含有重复值的index方法
Jun 27 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
python框架Django实战商城项目之工程搭建过程图文详解
Mar 09 Python
python Zmail模块简介与使用示例
Dec 19 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 #Python
Python使用smtplib模块发送电子邮件的流程详解
Jun 27 #Python
Python教程之全局变量用法
Jun 27 #Python
python设计模式大全
Jun 27 #Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 #Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 #Python
Python读写txt文本文件的操作方法全解析
Jun 26 #Python
You might like
PHP中Session可能会引起并发问题
2015/06/26 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
js 内存释放问题
2010/04/25 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
p5.js实现简单货车运动动画
2019/10/23 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
详解爬虫被封的问题
2019/04/23 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python tkinter canvas使用实例
2019/11/04 Python
Python异常继承关系和自定义异常实现代码实例
2020/02/20 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
JAVA程序员自荐书
2014/01/30 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
运动会广播稿20字
2014/02/18 职场文书
保险内勤岗位职责
2014/04/05 职场文书
班级寄语大全
2014/04/10 职场文书
Python绘制分类图的方法
2021/04/20 Python
PyTorch的Debug指南
2021/05/07 Python
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
Java 数据结构七大排序使用分析
2022/04/02 Java/Android