详解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 Mysql自动备份脚本
Jul 14 Python
Python2.5/2.6实用教程 入门基础篇
Nov 29 Python
Python中使用strip()方法删除字符串中空格的教程
May 20 Python
Python使用pymysql小技巧
Jun 04 Python
python九九乘法表的实例
Sep 26 Python
DRF跨域后端解决之django-cors-headers的使用
Jan 27 Python
python根据多个文件名批量查找文件
Aug 13 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
Feb 29 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 Python
解决Python数据可视化中文部分显示方块问题
May 16 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
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
php实例分享之二维数组排序
2014/05/15 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
Javascript window对象详解
2014/11/12 Javascript
javascript弹出窗口实现代码
2015/11/12 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Django后台admin的使用详解
2019/07/08 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
Servlet的生命周期
2013/08/25 面试题
市场营销专业毕业生自荐信
2013/11/02 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
乡镇个人对照检查材料
2014/08/22 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
工作态度不好检讨书
2015/05/06 职场文书
入学证明
2015/06/23 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS