详解Python中的__getitem__方法与slice对象的切片操作

作者:cangmean 时间:2022-04-26 19:54:55 

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,getitem,slice
0
投稿

猜你喜欢

  • golang 微服务之gRPC与Protobuf的使用

    2023-06-17 20:36:03
  • asp如何实现点击数的计算?

    2010-05-18 18:39:00
  • SQL Server 数据库故障修复顶级技巧之一

    2010-05-01 18:49:00
  • PHP入门教程之会话控制技巧(cookie与session)

    2023-11-16 00:13:39
  • python使用分治法实现求解最大值的方法

    2021-07-14 12:06:09
  • ASP中利用OWC控件实现图表功能详解

    2010-05-27 12:26:00
  • Python使用pandas将表格数据进行处理

    2023-10-08 06:23:55
  • Python源码学习之PyType_Type和PyBaseObject_Type详解

    2023-08-03 15:50:05
  • php 进阶:实现无限分类第1/4页

    2023-11-17 21:04:55
  • 10个杀手级应用的Python自动化脚本

    2023-10-06 14:01:53
  • ASP编程中使用数组方法实例讲解

    2008-02-15 08:25:00
  • GC与JS内存泄露

    2010-09-25 19:01:00
  • Python爬虫之获取心知天气API实时天气数据并弹窗提醒

    2023-04-17 14:40:58
  • php+Memcached实现简单留言板功能示例

    2023-11-15 09:30:02
  • 解决Python logging模块无法正常输出日志的问题

    2023-10-03 17:04:25
  • 超级连接的title提示中如何换行实现多行显示

    2008-03-07 15:57:00
  • 深入透析样式表滤镜(下)

    2011-06-14 09:49:19
  • python中的列表和元组实例详解

    2023-07-26 23:04:12
  • 商品评论的设计

    2009-12-23 13:06:00
  • php中如何判断一个网页请求是ajax请求还是普通请求

    2023-10-13 14:42:30
  • asp之家 网络编程 m.aspxhome.com