详解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 相关文章推荐
Python3.x版本中新的字符串格式化方法
Apr 24 Python
简单介绍Python的Django框架的dj-scaffold项目
May 30 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
Zabbix实现微信报警功能
Oct 09 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
Python常见字典内建函数用法示例
May 14 Python
手把手教你使用Python创建微信机器人
Apr 29 Python
Pycharm创建项目时如何自动添加头部信息
Nov 14 Python
python保留小数位的三种实现方法
Jan 07 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 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
打造计数器DIY三步曲(上)
2006/10/09 PHP
php自动注册登录验证机制实现代码
2011/12/20 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
jQuery 获取/设置/删除DOM元素的属性以a元素为例
2014/05/23 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
jQuery实现点击弹出背景变暗遮罩效果实例代码
2016/06/24 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python中使用不同编码读写txt文件详解
2015/05/28 Python
Python自动调用IE打开某个网站的方法
2015/06/03 Python
python在不同层级目录import模块的方法
2016/01/31 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
python使用建议与技巧分享(一)
2020/08/17 Python
Python 高效编程技巧分享
2020/09/10 Python
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
优秀学生干部推荐材料
2014/02/03 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书