详解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
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
python实现逆波兰计算表达式实例详解
May 06 Python
Python实现的科学计算器功能示例
Aug 04 Python
Python星号*与**用法分析
Feb 02 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
Jul 12 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
python的scipy实现插值的示例代码
Nov 12 Python
Python数组拼接np.concatenate实现过程
Apr 18 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
深度学习详解之初试机器学习
Apr 14 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 mssql 时间格式问题
2009/01/13 PHP
遍历指定目录下的所有目录和文件的php代码
2011/11/27 PHP
PHP常用的小程序代码段
2015/11/14 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
php闭包中使用use声明变量的作用域实例分析
2018/08/09 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
Javascript 继承实现例子
2009/08/12 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
分析python服务器拒绝服务攻击代码
2014/01/16 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
Python range与enumerate函数区别解析
2020/02/28 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
Python是什么 Python的用处
2020/05/26 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
python实现发送邮件
2021/03/02 Python
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
机械电子工程毕业生自荐信
2013/11/23 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
和谐社区口号
2014/06/19 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
python标准库ElementTree处理xml
2022/05/20 Python
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL