解析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中的魔法方法深入理解
Jul 09 Python
简单掌握Python中glob模块查找文件路径的用法
Jul 05 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
python如何将图片转换为字符图片
Aug 19 Python
python操作xlsx文件的包openpyxl实例
May 03 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
Python 学习教程之networkx
Apr 15 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
python中怎么表示空值
Jun 19 Python
python利用tkinter实现图片格式转换的示例
Sep 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
服务器端解压缩zip的脚本
2006/12/22 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
python3 线性回归验证方法
2019/07/09 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
2016/06/22 HTML / CSS
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
大学生活动总结模板
2014/07/02 职场文书
绿色小区申报材料
2014/08/22 职场文书
仰望星空观后感
2015/06/10 职场文书