详解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 运算符 供重载参考
Jun 11 Python
Python计算三维矢量幅度的方法
Jun 15 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
python语言基本语句用法总结
Jun 11 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
Python中six模块基础用法
Dec 08 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
python IDLE添加行号显示教程
Apr 25 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
学习Python需要哪些工具
Sep 04 Python
Python实现列表索引批量删除的5种方法
Nov 16 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 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教程 插件机制在PHP中实现方案
2012/11/02 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
php实现文件预览功能
2017/05/23 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
bootstrap table实例详解
2017/01/06 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
浅谈js闭包理解
2019/03/28 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python在线运行代码助手
2016/07/15 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
PyTorch基本数据类型(一)
2019/05/22 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
python time.strptime格式化实例详解
2021/02/03 Python
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
C语言基础笔试题
2013/04/27 面试题
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
小学教师见习总结
2015/06/23 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书