详解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的Supervisor进行进程监控以及自动启动
May 29 Python
跟老齐学Python之Import 模块
Oct 13 Python
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
深入学习Python中的装饰器使用
Jun 20 Python
Python利用IPython提高开发效率
Aug 10 Python
Python实现的栈、队列、文件目录遍历操作示例
May 06 Python
Python 转换文本编码实现解析
Aug 27 Python
python numpy之np.random的随机数函数使用介绍
Oct 06 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
Django框架下静态模板的继承操作示例
Nov 08 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
Python绘制分类图的方法
Apr 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调用数据库的存贮过程
2006/10/09 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
网页自动跳转代码收集
2009/09/27 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
python进阶教程之词典、字典、dict
2014/08/29 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
Python实现12306火车票抢票系统
2019/07/04 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
PHP面试题及答案二
2015/05/23 面试题
会计岗位描述
2014/02/22 职场文书
农村婚礼主持词
2014/03/13 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
纪念九一八事变演讲稿:牢记历史,捍卫主权
2014/09/14 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers