详解Python中的__getitem__方法与slice对象的切片操作


Posted in Python onJune 27, 2016

Fib实例虽然能作用于for循环,看起来和list有点像,但是,把它当成list来使用还是不行,比如,取第5个元素:

>>> Fib()[5]
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'Fib' object does not support indexing

要表现得像list那样按照下标取出元素,需要实现__getitem__()方法:

class Fib(object):
  def __getitem__(self, n):
    a, b = 1, 1
    for x in range(n):
      a, b = b, a + b
    return a

现在,就可以按下标访问数列的任意一项了:

>>> f = Fib()
>>> f[0]
1
>>> f[1]
1
>>> f[2]
2
>>> f[3]
3
>>> f[10]
89
>>> f[100]
573147844013817084101

slice对象与__getitem__

想要使类的实例像列表一样使用下标, 可以设置__getitem__方法。比如:

class _List(object):

  def __getitem__(self, key):
    print key

l = _List()
l[3]  # print 3

但是如果想要使用切片操作的

l[1:4] # print slice(1, 4, None)

会创建一个slice对象用于切片, 可以通过help(slice)查看具体操作。

a = slice(1, 4, None)

range(5)[a] # print [1, 2, 3]

更加丰富的操作

class _List(object):
  
  def __init__(self, _list):
    self._list = _list

  def __getitem__(self, key):
    if isinstance(key, int):
      return self._list[key]
    elif isinstance(key, slice):
      reutrn self.__class__(self._list[key])

if __name__ == '__main__':
  c = _List(range(10))
  b = c[1:5]
  print b[3] # print 4

如果key是一个整形的话就返回列表元素,如果是一个slice对象的话,就创建一个实例并返回。

Python 相关文章推荐
Python编程实现的图片识别功能示例
Aug 03 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
Python yield与实现方法代码分析
Feb 06 Python
浅述python中深浅拷贝原理
Sep 18 Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
Python字符串hashlib加密模块使用案例
Mar 10 Python
Django 再谈一谈json序列化
Mar 16 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
python urllib库的使用详解
Apr 13 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 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
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 #Python
You might like
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
Python过滤序列元素的方法
2020/07/31 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
课前一分钟演讲稿
2014/08/26 职场文书
教师节活动总结
2014/08/29 职场文书
2014年团队工作总结
2014/11/24 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
大学运动会通讯稿
2015/07/18 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python
Go语言实现Snowflake雪花算法
2021/06/08 Golang