解析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 相关文章推荐
使用IronPython把Python脚本集成到.NET程序中的教程
Mar 31 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
Selenium元素的常用操作方法分析
Aug 10 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
python实现雪花飘落效果实例讲解
Jun 18 Python
django框架防止XSS注入的方法分析
Jun 21 Python
docker-py 用Python调用Docker接口的方法
Aug 30 Python
python elasticsearch环境搭建详解
Sep 02 Python
python:目标检测模型预测准确度计算方式(基于IoU)
Jan 18 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
使用遗传算法求二元函数的最小值
Feb 11 Python
pycharm安装及如何导入numpy
Apr 03 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
CI框架整合smarty步骤详解
2016/05/19 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
原生JS封装animate运动框架的实例
2017/10/12 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
python对html代码进行escape编码的方法
2015/05/04 Python
Python可变参数用法实例分析
2017/04/02 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
社区工作感言
2014/02/21 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
创业计划书之花店
2019/09/20 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL