详解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中的两个内置模块介绍
Apr 05 Python
一些Python中的二维数组的操作方法
May 02 Python
Python类的定义、继承及类对象使用方法简明教程
May 08 Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
浅谈Python 敏感词过滤的实现
Aug 15 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
Django models filter筛选条件详解
Mar 16 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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 在线打包_支持子目录
2008/06/28 PHP
9段PHP实用功能的代码推荐
2014/10/14 PHP
thinkphp微信开发(消息加密解密)
2015/12/02 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
使用JavaScript switch case 另类写法
2010/03/14 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
区域销售经理职责
2013/12/22 职场文书
2013年学期结束动员演讲稿
2014/01/07 职场文书
党风廉政承诺书
2014/03/27 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
实习指导教师评语
2014/12/30 职场文书
学校运动会加油词
2015/07/18 职场文书
教师师德工作总结2015
2015/07/22 职场文书
2019单位介绍信怎么写
2019/06/24 职场文书
七年级作文之下雨天
2019/12/23 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技