详解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 相关文章推荐
python3访问sina首页中文的处理方法
Feb 24 Python
Python中__init__和__new__的区别详解
Jul 09 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
Python编码类型转换方法详解
Jul 01 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
Python操作注册表详细步骤介绍
Feb 05 Python
python如何实时获取tcpdump输出
Sep 16 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
python 标准库原理与用法详解之os.path篇
Oct 24 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 Python
python实现手机推送 代码也就10行左右
Apr 12 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抽奖小程序的实现代码
2013/06/18 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
php编程每天必学之表单验证
2016/03/01 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
Python的lambda匿名函数的简单介绍
2013/04/25 Python
python获取豆瓣电影简介代码分享
2014/01/16 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
Coltorti Boutique官网:来自意大利的设计师品牌买手店
2018/11/09 全球购物
遗体告别仪式答谢词
2014/01/23 职场文书
自我反省检讨书
2014/01/23 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
基于Python实现将列表数据生成折线图
2022/03/23 Python
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers
Ruby处理YAML和json数据
2022/04/18 Ruby