解析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找出文件中使用率最高的汉字实例详解
Jun 03 Python
python利用装饰器进行运算的实例分析
Aug 04 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
python绘制简单折线图代码示例
Dec 19 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
对python sklearn one-hot编码详解
Jul 10 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
python银行系统实现源码
Oct 25 Python
Python中__repr__和__str__区别详解
Nov 07 Python
TensorFlow tf.nn.max_pool实现池化操作方式
Jan 04 Python
python 监控logcat关键字功能
Sep 04 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
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
详谈php中 strtr 和 str_replace 的效率问题
2017/05/14 PHP
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
原生JS实现天气预报
2020/06/16 Javascript
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
Python中用于计算对数的log()方法
2015/05/15 Python
Python学习之用pygal画世界地图实例
2017/12/07 Python
python 除法保留两位小数点的方法
2018/07/16 Python
浅析使用Python搭建http服务器
2019/10/27 Python
Python版中国省市经纬度
2020/02/11 Python
python程序输出无内容的解决方式
2020/04/09 Python
python 装饰器的基本使用
2021/01/13 Python
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
电脑教师的自我评价
2013/12/18 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
2014年林业工作总结
2014/12/05 职场文书
个人先进事迹材料
2014/12/29 职场文书
工作能力自我评价2015
2015/03/05 职场文书
领导离职感言
2015/08/03 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
Java的Object类的九种方法
2022/04/13 Java/Android