解析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写xml文件的操作实例
Oct 05 Python
探索Python3.4中新引入的asyncio模块
Apr 08 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
Python分支语句与循环语句应用实例分析
May 07 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
python画微信表情符的实例代码
Oct 09 Python
Python SQLAlchemy入门教程(基本用法)
Nov 11 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
js密码强度检测
2016/01/07 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
重命名批处理python脚本
2013/04/05 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
python中的json总结
2018/10/11 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
C++的几个面试题附答案
2016/08/03 面试题
什么是TCP/IP
2014/07/27 面试题
三好生演讲稿
2014/09/12 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
python实现的web监控系统
2021/04/27 Python
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS