详解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 10 Python
Python的Django框架中的Context使用
Jul 15 Python
pycharm安装图文教程
May 02 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
jupyter notebook 中输出pyecharts图实例
Apr 23 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
python小白学习包管理器pip安装
Jun 09 Python
Python如何读取、写入CSV数据
Jul 28 Python
Python基础之tkinter图形化界面学习
Apr 29 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
图象函数中的中文显示
2006/10/09 PHP
PHP 中文处理技巧
2010/04/25 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
django框架模板语言使用方法详解
2019/07/18 Python
python实现视频读取和转化图片
2019/12/10 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
python时间time模块处理大全
2020/10/25 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
成功的酒店创业计划书
2013/12/27 职场文书
军校本科大学生自我评价
2014/01/14 职场文书
出纳担保书范文
2014/04/02 职场文书
人力资源求职信
2014/05/25 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
python开发人人对战的五子棋小游戏
2022/05/02 Python
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript