详解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 02 Python
通过Python来使用七牛云存储的方法详解
Aug 07 Python
学习python类方法与对象方法
Mar 15 Python
python 性能提升的几种方法
Jul 15 Python
python中实现迭代器(iterator)的方法示例
Jan 19 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
Python实现的圆形绘制(画圆)示例
Jan 31 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
Python运行异常管理解决方案
Mar 09 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 Python
python多线程方法详解
Jan 18 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
php 数学运算验证码实现代码
2009/10/11 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
Js中sort()方法的用法
2006/11/04 Javascript
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
javascript Object与Function使用
2010/01/11 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
Python3实现的简单工资管理系统示例
2019/03/12 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
python re.match()用法相关示例
2021/01/27 Python
P/Invoke是什么
2015/07/31 面试题
简洁的英文求职信范文
2014/05/03 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
爱护环境建议书
2015/09/14 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android