详解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获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
Python 26进制计算实现方法
May 28 Python
Python 基础知识之字符串处理
Jan 06 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
Oct 22 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
python颜色随机生成器的实例代码
Jan 10 Python
python PIL模块的基本使用
Sep 29 Python
python3.9之你应该知道的新特性详解
Apr 29 Python
浅谈Python类的单继承相关知识
May 12 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和ACCESS写聊天室(四)
2006/10/09 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
Python内置数据类型详解
2014/08/18 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
Python读写docx文件的方法
2018/05/08 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
HTML5制作表格样式
2016/11/15 HTML / CSS
党员个人剖析材料
2014/09/30 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
表扬通报怎么写
2015/01/16 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
python和anaconda的区别
2022/05/06 Python
python热力图实现的完整实例
2022/06/25 Python