解析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编程中的反模式实例分析
Dec 08 Python
Python sys.argv用法实例
May 28 Python
Python中字典和集合学习小结
Jul 07 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
python+Splinter实现12306抢票功能
Sep 25 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
pytorch1.0中torch.nn.Conv2d用法详解
Jan 10 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
pandas取dataframe特定行列的实现方法
May 24 Python
利用Python实时获取steam特惠游戏数据
Jun 25 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
3
2006/10/09 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
JavaScript 学习点滴记录
2009/04/24 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
animate动画示例(泪奔的小孩)及stop和delay的使用
2013/05/06 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
python 实现图片批量压缩的示例
2020/12/18 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
软件测试面试题
2015/10/21 面试题
电工工作职责范本
2014/02/22 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
会计试用期自我评价
2015/03/10 职场文书
行政申诉状范文
2015/05/20 职场文书
关于远足的感想
2015/08/10 职场文书
高中数学教学反思范文
2016/02/18 职场文书
2019求职信大礼包
2019/05/15 职场文书
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers