解析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运行报错UnicodeDecodeError的解决方法
Jun 07 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
python实现稀疏矩阵示例代码
Jun 09 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
python实现朴素贝叶斯分类器
Mar 28 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
详细分析Python collections工具库
Jul 16 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 27 Python
Django展示可视化图表的多种方式
Apr 08 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
PHP5/ZendEngine2的改进
2006/10/09 PHP
如何对PHP程序中的常见漏洞进行攻击
2006/10/09 PHP
菜鸟学PHP之Smarty入门
2007/01/04 PHP
php xml-rpc远程调用
2008/12/19 PHP
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
javascript dom代码应用 简单的相册[firefox only]
2010/06/12 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
js实现随机8位验证码
2020/07/24 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
tensorflow 查看梯度方式
2020/02/04 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
经典优秀个人求职自荐信格式
2013/09/25 职场文书
最新教师自我评价分享
2013/11/12 职场文书
货车司机岗位职责
2014/03/18 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
保研专家推荐信范文
2015/03/25 职场文书
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS