解析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 相关文章推荐
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
Python实现修改文件内容的方法分析
Mar 25 Python
Python中交换两个元素的实现方法
Jun 29 Python
python2与python3中关于对NaN类型数据的判断和转换方法
Oct 30 Python
python爬取微信公众号文章的方法
Feb 26 Python
python仿evething的文件搜索器实例代码
May 13 Python
pyinstaller还原python代码过程图解
Jan 08 Python
Python基于gevent实现文件字符串查找器
Aug 11 Python
Python configparser模块应用过程解析
Aug 14 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
May 19 Python
Python 视频画质增强
Apr 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
php通过前序遍历树实现无需递归的无限极分类
2015/07/10 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
复制本贴标题和地址的js代码
2008/07/01 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现自动重启本程序的方法
2015/07/09 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
pandas DataFrame的修改方法(值、列、索引)
2019/08/02 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
HR喜欢的自荐信格式
2013/10/08 职场文书
毕业生简单求职信
2013/11/19 职场文书
男方父母婚礼答谢词
2014/01/25 职场文书
反邪教警示教育方案
2014/05/13 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
幼师大班个人总结
2015/02/13 职场文书
匿名检举信范文
2015/03/02 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记