详解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插入排序算法实例分析
Jul 03 Python
Python如何实现MySQL实例初始化详解
Nov 06 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
在python里从协程返回一个值的示例
Feb 19 Python
python使用Plotly绘图工具绘制气泡图
Apr 01 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
django admin组件使用方法详解
Jul 19 Python
python Pillow图像处理方法汇总
Oct 16 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 Python
Python jieba库分词模式实例用法
Jan 13 Python
Django migrate报错的解决方案
May 20 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根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
使用node.js搭建服务器
2017/05/20 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
Python中functools模块函数解析
2017/03/12 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
土木工程毕业生自荐信
2013/09/21 职场文书
医学专业大学生求职的自我评价
2013/11/27 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
《这儿真好》教学反思
2014/02/22 职场文书
抵押贷款承诺书
2014/05/30 职场文书
2014年关工委工作总结
2014/11/17 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
邀请函格式范文
2015/02/02 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书