解析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中的lambda表达式用法详解
Jun 22 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
Django中create和save方法的不同
Aug 13 Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 Python
Python: 传递列表副本方式
Dec 19 Python
TensorFlow tf.nn.max_pool实现池化操作方式
Jan 04 Python
Django ValuesQuerySet转json方式
Mar 16 Python
python实现对变位词的判断方法
Apr 05 Python
django使用JWT保存用户登录信息
Apr 22 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
python可视化之颜色映射详解
Sep 15 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
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
php实现数组纵向转横向并过滤重复值的方法分析
2017/05/29 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
JQuery性能优化的几点建议
2014/05/14 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
python正则表达式中的括号匹配问题
2014/12/14 Python
python通过wxPython打开一个音频文件并播放的方法
2015/03/25 Python
python回调函数用法实例分析
2015/05/09 Python
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
Python实现AI换脸功能
2020/04/10 Python
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
个人自荐书
2013/12/20 职场文书
总账会计岗位职责
2014/03/13 职场文书
解除合同协议书
2014/04/17 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
Python实现聚类K-means算法详解
2022/07/15 Python