详解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内置函数的用法实例教程
Sep 08 Python
Python基础之函数用法实例详解
Sep 10 Python
详解Python中find()方法的使用
May 18 Python
python协程用法实例分析
Jun 04 Python
python通过cookie模拟已登录状态的初步研究
Nov 09 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
python统计字母、空格、数字等字符个数的实例
Jun 29 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
python读取hdfs上的parquet文件方式
Jun 06 Python
python字符串拼接+和join的区别详解
Dec 03 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
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
PHP会话处理的10个函数
2015/08/11 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
教师应聘个人求职信
2013/12/10 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
创业培训计划书
2014/05/03 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
秋菊打官司观后感
2015/06/03 职场文书
消防演习感想
2015/08/10 职场文书
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫