当前位置: 首页 > 编程笔记 >

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

孔礼骞
2023-03-14
本文向大家介绍详解Python中的__getitem__方法与slice对象的切片操作,包括了详解Python中的__getitem__方法与slice对象的切片操作的使用技巧和注意事项,需要的朋友参考一下

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__专有方法,包括了解析Python中的__getitem__专有方法的使用技巧和注意事项,需要的朋友参考一下 __getitem__ 来看个简单的例子就明白: (1)  __getitem__ 专用方法很简单。像普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。但是怎么调用它呢?哦,你可以直接调用 __

  • 本文向大家介绍Python对excel文档的操作方法详解,包括了Python对excel文档的操作方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python对excel文档的操作方法。分享给大家供大家参考,具体如下: pip安装python库:(linux命令行输入不要在idle输入) 1.获取excel中的数据 利用xlrd模块读取并简单操作excel文档: 1.打开excel

  • 本文向大家介绍Golang slice切片操作之切片的追加、删除、插入等,包括了Golang slice切片操作之切片的追加、删除、插入等的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Golang slice切片操作之切片的追加、删除、插入等,分享给大家,具体如下: 一、一般操作 1,声明变量,go自动初始化为nil,长度:0,地址:0,nil 2,切片的追加,删除,插入操作 3,copy的

  • Slice切片   Go中的数组和PHP中的数组很不一样,没法排序,没法添加。不过Go中有一种数据类型叫做Slice切片,这个数据类型很类似于PHP中的数组。我个人感觉也是利用率比较高的数据类型。   Slice切片实际上是对一个数组上的连续一段的引用,一个未初始化的分片的值是nil。一个切片,一旦初始化后它总是关联着一个容纳其元素的底层数组,所以一个分片和它的数组共享存储。 定义 slice :

  • 概述 切片是一种动态数组,比数组操作灵活,长度不是固定的,可以进行追加和删除。 len() 和 cap() 返回结果可相同和不同。 声明切片 //demo_7.go package main import ( "fmt" ) func main() { var sli_1 [] int //nil 切片 fmt.Printf("len=%d cap=%d sl

  • 本文向大家介绍Javascript中arguments对象的详解与使用方法,包括了Javascript中arguments对象的详解与使用方法的使用技巧和注意事项,需要的朋友参考一下 一、arguments使用方法 通过方括号语法访问每一个元素 通过length属性,查看到底要几个参数 参数赋值(“严格模式下不允许”) 二、arguments与数组的关系 虽然arguments可以使用中括号语法,