解析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加pyGame实现的简单拼图游戏实例
May 15 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
用Python实现数据的透视表的方法
Nov 16 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
python tornado使用流生成图片的例子
Nov 18 Python
对python中return与yield的区别详解
Mar 12 Python
python实现数字炸弹游戏程序
Jul 17 Python
python3将变量输入的简单实例
Aug 19 Python
python用Configobj模块读取配置文件
Sep 26 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 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
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
ajax请求get与post的区别总结
2013/11/04 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
Python实现序列化及csv文件读取
2020/01/19 Python
Python控制台实现交互式环境执行
2020/06/09 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
解除合同协议书
2014/04/17 职场文书
慈善晚会策划方案
2014/05/14 职场文书
雷锋的故事观后感
2015/06/10 职场文书
离职信范本
2015/06/23 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers