解析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中常用的各种数据库操作模块和连接实例
May 29 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
Mar 11 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
flask中过滤器的使用详解
Aug 01 Python
神经网络相关之基础概念的讲解
Dec 29 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
python实现的自动发送消息功能详解
Aug 15 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
Mar 18 Python
keras的backend 设置 tensorflow,theano操作
Jun 30 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
ajax缓存问题解决途径
2006/12/06 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
AngularJs bootstrap详解及示例代码
2016/09/01 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
python3.5使用tkinter制作记事本
2016/06/20 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
化学专业毕业生自荐信
2013/11/15 职场文书
主持词开场白
2014/03/17 职场文书
大一新生学期自我评价
2014/04/09 职场文书
宣传活动总结范文
2014/07/01 职场文书
房屋转让协议书
2014/10/18 职场文书
股权转让协议书
2014/12/07 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
JavaScript实现栈结构详细过程
2021/12/06 Javascript