解析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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
python实现超简单端口转发的方法
Mar 13 Python
Python 序列的方法总结
Oct 18 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
Flask实现跨域请求的处理方法
Sep 27 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
python pygame实现方向键控制小球
May 17 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
python操作xlsx格式文件并读取
Jun 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 smarty函数扩展
2010/03/15 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
python的绘图工具matplotlib使用实例
2014/07/03 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
在IPython中进行Python程序执行时间的测量方法
2018/11/01 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
Python定时器线程池原理详解
2020/02/26 Python
python对文件的操作方法汇总
2020/02/28 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
环境工程专业自荐信范文
2014/03/18 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
教师师德工作总结2015
2015/07/22 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android