解析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在多玩图片上下载妹子图的实现代码
Aug 13 Python
用python实现面向对像的ASP程序实例
Nov 10 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
Django自定义过滤器定义与用法示例
Mar 22 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
Django处理文件上传File Uploads的实例
May 28 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
解决Python运行文件出现out of memory框的问题
Dec 03 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
python线程池如何使用
May 28 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
PHP递归算法的简单实例
2019/02/28 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
python实现八大排序算法(2)
2017/09/14 Python
python接入支付宝的实例操作
2020/07/20 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
高中军训感言500字
2014/02/24 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
售房协议书范本2014
2014/10/23 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
房产分割协议书范文
2014/11/21 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
工作自我评价范文
2015/03/05 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
小学运动会入场词
2015/07/18 职场文书
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫