如何定义getitem类以处理纯索引和切片?

切片对象当您使用的下标符号冒号被自动创建的-而这正是传递给__getitem__。使用isinstance来检查,如果你有一个切片对象:

from __future__ import print_function

class Sliceable(object):

def __getitem__(self, subscript):

if isinstance(subscript, slice):

# do your handling for a slice object:

print(subscript.start, subscript.stop, subscript.step)

else:

# Do your handling for a plain index

print(subscript)

假设我们使用的是范围对象,但我们希望切片返回列表,而不是新的范围对象(确实如此):

>>> range(1,100, 4)[::-1]

range(97, -3, -4)

由于内部限制,我们不能对范围进行子类化,但是我们可以委托给它:

class Range:

"""like builtin range, but when sliced gives a list"""

__slots__ = "_range"

def __init__(self, *args):

self._range = range(*args) # takes no keyword arguments.

def __getattr__(self, name):

return getattr(self._range, name)

def __getitem__(self, subscript):

result = self._range.__getitem__(subscript)

if isinstance(subscript, slice):

return list(result)

else:

return result

r = Range(100)

我们没有完美可替换的Range对象,但它非常接近:

>>> r[1:3]

[1, 2]

>>> r[1]

1

>>> 2 in r

True

>>> r.count(3)

1

为了更好地理解切片符号,这是Sliceable的示例用法:

>>> sliceme = Sliceable()

>>> sliceme[1]

1

>>> sliceme[2]

2

>>> sliceme[:]

None None None

>>> sliceme[1:]

1 None None

>>> sliceme[1:2]

1 2 None

>>> sliceme[1:2:3]

1 2 3

>>> sliceme[:2:3]

None 2 3

>>> sliceme[::3]

None None 3

>>> sliceme[::]

None None None

>>> sliceme[:]

None None None

Python 2,请注意:

在Python 2中,有一个不赞成使用的方法,在子类化某些内置类型时可能需要重写该方法。

从数据模型文档中:

object.__getslice__(self, i, j)

从2.0版开始不推荐使用:支持将切片对象用作__getitem__()方法的参数。(但是,CPython中的内置类型当前仍在实现__getslice__()。因此,在实现切片时必须在派生类中重写它。)

这在Python 3中已经消失了。

python getitem用法_Python:在__getitem__中实现切片相关推荐

  1. python end用法_python中end的使用方法

    python中end的使用方法 发布时间:2020-06-17 09:47:13 来源:亿速云 阅读:178 这篇文章给大家分享的是有关python中end的使用方法,小编觉得挺实用的,因此分享给大家 ...

  2. python try用法_python中的try的用法

    展开全部 try语句32313133353236313431303231363533e78988e69d8331333431366238是python里面的控制语句,与except,finally配合 ...

  3. python return用法_Python 为什么没有 void 关键字?

    void 是编程语言中最常见的关键字之一,从字面上理解,它是"空的.空集.空白"的意思,最常用于表示函数的一种返回值类型. 维基百科上有一个定义: The void type, i ...

  4. python字符串添加元素_python向字符串中添加元素的实例方法

    Python中的字符串对象是不能更改的,也即直接修改字符串中的某一位或几位字符是实现不了的,即python中字符串对象不可更改,但字符串对象的引用可更改,可重新指向新的字符串对象. + 直接字符串外+ ...

  5. python基本用法_Python基本用法总结

    Python 的设计具有很强的可读性,易于使用.这里对python基本用法做一个总结介绍. 一. 变量类型 1. 变量赋值 Python中的变量赋值不需要类型声明,每个变量在使用前都必须赋值,变量赋值 ...

  6. python字符串转义序列_Python | 忽略字符串中的转义序列

    python字符串转义序列 First see, how escape sequence works? 首先看,转义序列如何工作? In the below example, we are using ...

  7. python yield用法_Python中迭代器和生成器的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  8. python的继承用法_python之继承中组合用法与菱形继承关系查找法

    1.什么是组合 组合就是一个类的对象具备某一属性,该属性的值是指向另外外一个类的对象 2.为什么用组合 组合也是用来解决类与类之间代码冗余问题 3.用法 class Course:           ...

  9. python中tile的用法_Python:numpy中的tile函数

    在学习机器学习实教程时,实现KNN算法的代码中用到了numpy的tile函数,因此对该函数进行了一番学习: tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复 ...

最新文章

  1. python网络爬虫的基本步骤-Python网络爬虫学习手记(1)——爬虫基础
  2. php 开发商城 注意,php开发微商城要注意什么
  3. Raising Modulo Numbers
  4. amd cpu 不兼容centos5.5_AMD放弃兼容性?这事简单也不简单
  5. 注解_JDK内置注解
  6. IE的documentMode属性
  7. html只读下拉框,Html.DropDownList – 禁用/只读
  8. 《三层架构之抽象工厂加反射》纠错
  9. VC下绘图程序Demo
  10. 1.7.05:输出亲朋字符串
  11. ArcPad8新功能介绍
  12. Html中跳转到其他页面
  13. 计算机断网后怎么连接网络连接,电脑突然断网, 连接不上网络怎么办? 三种方法轻松找回...
  14. 数据结构单链表:指定结点的前插、后插操作
  15. 神州优车上云之路:如何在效率、质量和成本三方面达到平衡?
  16. ctf流量分析练习二
  17. 《人性的弱点》25句经典语录
  18. 三个常见博弈游戏以及 SG 函数和 SG 定理
  19. The request was rejected because the URL contained a potentially malicious String “%2e“
  20. 基于LRU-K算法设计本地缓存实现流量削峰

热门文章

  1. 看别人关于设计模式的文章很深刻,不是很明白
  2. 2021重庆市高考成绩排名查询,2021年重庆各高中高考成绩排名及放榜最新消息
  3. 华为harmonyos 2.0,连接无限可能,华为HarmonyOS 2.0 正式发布
  4. 内网渗透-Metasploit之——基本后渗透命令
  5. java反射field_java反射field用法
  6. Redis内存不足解决方案
  7. 安装 KeyShot 流程
  8. Mac中安装homebrew全过程(附常用问题解决办法)
  9. # 工欲善其事必先利其器-C语言拓展--嵌入式C语言(三)
  10. 【特征提取】心电信号PTT+HRV+PRV含Matlab源码