Python自定义对象实现切片功能的介绍(代码示例)

本篇文章给大家带来的内容是关于python自定义对象实现切片功能的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

1、魔术方法:__getitem__()

想要使自定义对象支持切片语法并不难,只需要在定义类的时候给它实现魔术方法 __getitem__() 即可。所以,这里就先介绍一下这个方法。

语法: object.__getitem__(self, key)

官方文档释义:Called to implement evaluation of self[key]. For sequence types, the accepted keys should be integers and slice objects. Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the __getitem__() method. If key is of an inappropriate type, TypeError may be raised; if of a value outside the set of indexes for the sequence (after any special interpretation of negative values), IndexError should be raised. For mapping types, if key is missing (not in the container), KeyError should be raised.

概括翻译一下:__getitem__() 方法用于返回参数 key 所对应的值,这个 key 可以是整型数值和切片对象,并且支持负数索引;如果 key 不是以上两种类型,就会抛 TypeError;如果索引越界,会抛 IndexError ;如果定义的是映射类型,当 key 参数不是其对象的键值时,则会抛 KeyError 。

2、自定义序列实现切片功能

立即学习“Python免费学习笔记(深入)”;

接下来,我们定义一个简单的 MyList ,并给它加上切片功能。(PS:仅作演示,不保证其它功能的完备性)。

class MyList():    def __init__(self):        self.data = []    def append(self, item):        self.data.append(item)    def __getitem__(self, key):        print("key is : " + str(key))        return self.data[key]l = MyList()l.append("My")l.append("name")l.append("is")l.append("Python猫")print(l[3])print(l[:2])print(l['hi'])### 输出结果:key is : 3Python猫key is : slice(None, 2, None)['My', 'name']key is : hiTraceback (most recent call last):...TypeError: list indices must be integers or slices, not str

登录后复制

从输出结果来看,自定义的 MyList 既支持按索引查找,也支持切片操作,这正是我们的目的。

特别需要说明的是,此例中的 __getitem__() 方法会根据不同的参数类型而实现不同的功能(取索引位值或切片值),也会妥当地处理异常,所以并不需要我们再去写繁琐的处理逻辑。网上有不少学习资料完全是在误人子弟,它们会教你区分参数的不同类型,然后写一大段代码来实现索引查找和切片语法,简直是画蛇添足。下面的就是一个代表性的错误示例:

###略去其它代码####def __getitem__(self, index):    cls = type(self)    if isinstance(index, slice):  # 如果index是个切片类型,则构造新实例       return cls(self._components[index])    elif isinstance(index, numbers.Integral):  # 如果index是个数,则直接返回        return self._components[index]    else:        msg = "{cls.__name__} indices must be integers"        raise TypeError(msg.format(cls=cls))

登录后复制

3、自定义字典实现切片功能

切片是序列类型的特性,所以在上例中,我们不需要写切片的具体实现逻辑。但是,对于其它非序列类型的自定义对象,就得自己实现切片逻辑。以自定义字典为例(PS:仅作演示,不保证其它功能的完备性):

class MyDict():    def __init__(self):        self.data = {}    def __len__(self):        return len(self.data)    def append(self, item):        self.data[len(self)] = item    def __getitem__(self, key):        if isinstance(key, int):            return self.data[key]        if isinstance(key, slice):            slicedkeys = list(self.data.keys())[key]            return {k: self.data[k] for k in slicedkeys}        else:            raise TypeErrord = MyDict()d.append("My")d.append("name")d.append("is")d.append("Python猫")print(d[2])print(d[:2])print(d[-4:-2])print(d['hi'])### 输出结果:is{0: 'My', 1: 'name'}{0: 'My', 1: 'name'}Traceback (most recent call last):...TypeError

登录后复制

上例的关键点在于将字典的键值取出,并对键值的列表做切片处理,其妙处在于,不用担心索引越界和负数索引,将字典切片转换成了字典键值的切片,最终实现目的。

4、小结

最后小结一下:本文介绍了__getitem__() 魔术方法,并用于实现自定义对象(以列表类型和字典类型为例)的切片功能,希望对你有所帮助。

以上就是Python自定义对象实现切片功能的介绍(代码示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2534383.html

(0)
上一篇 2025年3月5日 21:30:05
下一篇 2025年3月5日 21:30:12

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 电脑如何截图、截图快捷键?

    截图是我们在电脑使用中经常会用到的一个功能,可以将电脑屏幕上的画面保存下来。你知道电脑有多种截图方式吗?php小编百草为大家收集整理了电脑截图的快捷键以及多种截图方法,下面详细介绍,教大家如何快捷且高效地进行电脑截图。 一、电脑如何截图、截…

    2025年3月5日
    200
  • 电脑怎样查无线网密码

    忘记了无线网密码?别担心!php小编子墨为大家带来简单易行的解决方法。无论你是使用 windows、macos 还是 linux 系统,我们将指导你一步步找回你的密码。继续阅读本文,了解如何轻松获取连接到你设备的任何无线网络的密码。 一、电…

    2025年3月5日
    200
  • 双硬盘如何分区装系统?

    面对两块硬盘同时存在的难题,如何科学合理地分区装系统?php小编草莓为您带来双硬盘分区装系统的全方位指南,助您轻松解决这一技术难题。本文将深入解析双硬盘分区的优势、分区方案、安装流程和注意事项,提供详尽的图文说明,引导您打造稳定高效的双硬盘…

    2025年3月5日
    200
  • 什么软件能控制wi-fi

    控制 wi-fi 的软件工具可以极大地提升网络管理效率。php小编西瓜带来一系列适用于不同设备和操作系统的 wi-fi 控制软件,帮助大家解决以下问题:如何监控 wi-fi 连接状态?如何限制设备接入 wi-fi?如何提升 wi-fi 信号…

    2025年3月5日
    200
  • 电脑声卡装在什么地方?

    很多的朋友在组装电脑时,都会遇到声卡装在哪里这个问题。对于这个问题,php小编柚子为大家整理了相关内容,为大家详细介绍电脑声卡的安装位置。下面是具体内容: 一、电脑声卡装在什么地方? 电脑声卡一般装在主板上,连接在PCI卡槽上。这是一种集成…

    2025年3月5日
    200
  • 手机一定要root才能连接电脑吗?

    这个问题困扰着许多android用户:手机连接电脑是否需要root权限?php小编草莓将为您解答这个难题,详细介绍手机连接电脑的两种常见方法:usb调试和第三方应用程序。通过阅读本文,您将明确知道是否需要root手机,以及如何安全、便捷地连…

    2025年3月5日
    200
  • 苹果电脑终端密码是什么密码?

    苹果电脑终端密码通常指管理员密码,用于对系统进行高级操作。如果您忘记或无法访问该密码,将严重影响您对系统的控制。php小编新一为大家带来解决苹果电脑终端密码丢失的详细指南,带您一步步找回密码,重新掌控系统。 一、苹果电脑终端密码是什么密码?…

    2025年3月5日
    200
  • win10未激活如何创建我的电脑图标?

    很多用户不知道win10未激活如何创建我的电脑图标,php小编草莓就来为大家解决这个问题,php小编草莓接下来就会给大家带来win10未激活创建我的电脑图标详细内容,希望对大家有所帮助哦! 一、win10未激活如何创建我的电脑图标? 1、在…

    2025年3月5日
    200
  • 怎么找到黑客的联系方式?

    如果你想要找到黑客的联系方式,那么你可能面临以下难题:黑客往往会隐藏他们的身份,并且他们的联系方式很难被发现。php小编草莓在这里为你提供了一份指南,旨在帮助你找到黑客的联系方式。在本指南中,我们将介绍一些常见的黑客使用的联系方式,并提供一…

    2025年3月5日
    200
  • 如何查看电脑配置硬件型号 | 电脑硬件型号查询方法

    想知道你的电脑硬件型号,却不知道从何入手?php小编鱼仔贴心整理了一份全面的电脑硬件型号查询指南,帮助你了解每种硬件的具体型号。从cpu、内存到显卡、主板,我们逐一讲解,让你轻松掌握电脑硬件信息。继续阅读下文,获取详细的查询方法和技巧,让你…

    2025年3月5日
    200

发表回复

登录后才能评论