位置: 编程技术 - 正文

python魔法方法-自定义序列详解(python魔法方法有啥用)

编辑:rootadmin

推荐整理分享python魔法方法-自定义序列详解(python魔法方法有啥用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python魔法方法str,python魔法方法官方文档,python魔法方法str,Python魔法方法,python魔法方法详解,python魔法方法有啥用,python魔法方法有啥用,python魔法方法详解,内容如对您有帮助,希望把文章链接给更多的朋友!

自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等)。

如果要实现这个功能,就要遵循 python 的相关的协议。所谓的协议就是一些约定内容。例如,如果要将一个类要实现迭代,就必须实现两个魔法方法:__iter__、next(python3.x中为__new__)。__iter__应该返回一个对象,这个对象必须实现 next 方法,通常返回的是 self 本身。而 next 方法必须在每次调用的时候都返回下一个元素,并且当元素用尽时触发 StopIteration 异常。

而其实 for 循环的本质就是先调用对象的__iter__方法,再不断重复调用__iter__方法返回的对象的 next 方法,触发 StopIteration 异常时停止,并内部处理了这个异常,所以我们看不到异常的抛出。

这种关系就好像接口一样,如果回顾以前几篇的魔法方法,可以发现许多的内置函数得到的结果就是相应的魔法方法的返回值。

下面是一下相关的魔法方法:

&#;__len__(self)

&#;返回容器的长度。可变和不可变容器都要实现它,这是协议的一部分。

&#;__getitem__(self, key)

&#;定义当某一项被访问时,使用self[key]所产生的行为。这也是可变容器和不可变容器协议的一部分。如果键的类型错误将产生TypeError;如果key没有合适的值则产生KeyError。

&#;__setitem__(self, key, value)

&#;定义当一个条目被赋值时,使用self[key] = value所产生的行为。这也是可变容器协议的一部分。而且,在相应的情形下也会产生KeyError和TypeError。

&#;__delitem__(self, key)

&#;定义当某一项被删除时所产生的行为。(例如del self[key])。这是可变容器协议的一部分。当你使用一个无效的键时必须抛出适当的异常。

&#;__iter__(self)

&#;返回一个容器迭代器,很多情况下会返回迭代器,尤其是当内置的iter()方法被调用的时候,以及当使用for x in container:方式循环的时候。迭代器是它们本身的对象,它们必须定义返回self的__iter__方法。

&#;__reversed__(self)

&#;实现当reversed()被调用时的行为。应该返回序列反转后的版本。仅当序列是有序的时候实现它,例如列表或者元组。

&#;__contains__(self, item)

&#;定义了调用in和not in来测试成员是否存在的时候所产生的行为。这个不是协议要求的内容,但是你可以根据自己的要求实现它。当__contains__没有被定义的时候,Python会迭代这个序列,并且当找到需要的值时会返回True。

python魔法方法-自定义序列详解(python魔法方法有啥用)

&#;__missing__(self, key)

&#;其在dict的子类中被使用。它定义了当一个不存在字典中的键被访问时所产生的行为。(例如,如果我有一个字典d,当"george"不是字典中的key时,使用了d["george"],此时d.__missing__("george")将会被调用)。

下面是一个代码示例:

这里创建一个模拟字典的类,这个类的内部维护了两个列表,key 负责储存键,value 负责储存值,两个列表通过索引的一一对应,从而达到模拟字典的目的。

首先,我们看看__len__方法,按照协议,这个方法应该返回容器的长度,因为这个类在设计的时候要求两个列表必须等长,所以理论上返回哪个列表的长度都是一样的,这里我选择返回 key 的长度。

然后是__getitem__方法。这个方法会在a['scolia']时,调用a.__getitem__('scolia')。也就是说这个方法定义了元素的获取,我这里的思路是先找到 key 列表中建的索引,然后用索引去 value 列表中找对应的元素,然后将其返回。然后为了进一步伪装成字典,我捕获了可能产生的 ValueError (这是 item 不在 key 列表中时触发的异常),并将其伪装成字典找不到键时的 KeyError。

理论上只要实现了上面两个方法,就可以得到一个不可变的容器了。但是我觉得并不满意所以继续拓展。

__setitem__(self, key, value)方法定义了 a['scolia'] = 'good' 这种操作时的行为,此时将会调用a.__setitem__('scolia', 'good') 因为是绑定方法,所以self是自动传递的,我们不用理。这里我也模拟了字典中对同一个键赋值时会造成覆盖的特性。这个方法不用返回任何值,所以return语句也省略了。

__delitem__(self, key)方法定义了del a['scolia'] 这类操作时候的行为,里面的‘scolia'就作为参数传进去。这里也进行了异常的转换。

只有实现里以上四个方法,就可以当做可变容器来使用了。有同学可能发现并没有切片对应的魔法方法,而事实上,我也暂时没有找到先,这部分内容先搁着一边。

接下来的 __str__ 是对应于 str() 函数,在类的表示中会继续讨论,这里是为了 print 语句好看才加进去的,因为print语句默认就是调用str()函数。

__iter__和next方法在开头的时候讨论过了,这里是为了能让其进行迭代操作而加入的。

__reversed__(self)方法返回一个倒序后的副本,这里体现了有序性,当然是否需要还是要看个人。

__contains__实现了成员判断,这里我们更关心value列表中的数据,所以判断的是value列表。该方法要求返回布尔值。

下面是相应的测试:

&#;__missing__(self, key)

测试:

当然你也可以在找不到 key 的时候触发异常,具体实现看个人需求。

以上这篇python魔法方法-自定义序列详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

python装饰器初探(推荐) 一、含有一个装饰器#encoding:utf-8############含有一个装饰器#########defouter(func):definner(*args,**kwargs):#要装饰f1(),这里用这俩形式参数,可以接受任意个参

Python实现Sqlite将字段当做索引进行查询的方法 本文实例讲述了Python实现Sqlite将字段当做索引进行查询的方法。分享给大家供大家参考,具体如下:默认从sqlite中获取到的数据是数字索引的,在开发阶

wxpython中Textctrl回车事件无效的解决方法 本文实例讲述了wxpython中Textctrl回车事件无效的解决方法。分享给大家供大家参考,具体如下:今天使用wxptyhon的Textctrl控件开发客户端时遇到了一个问题

标签: python魔法方法有啥用

本文链接地址:https://www.jiuchutong.com/biancheng/386224.html 转载请保留说明!

上一篇:浅谈Python 字符串格式化输出(format/printf)(python字符有哪些)

下一篇:python装饰器初探(推荐)

  • 小规模公司减免的增值税怎么算
  • 股票初始计量后按新金融准则计入哪个科目
  • 飞机票抵扣进项税怎么计算民航发展基金
  • 金税盘地区编号查询
  • 存续分立的账务处理
  • 计提印花税走什么科目
  • 股东购买固定资产能算实收资本么
  • 罚款收据与通用的区别
  • 固定资产新建帐套
  • 工程结算账务处理实例
  • 融资性售后回租承租方出售资产为什么不缴纳增值税
  • 房地产企业临时售楼部房产据含土地价值吗
  • 一个工程项目多次收款怎样预交增值税
  • 符合营改增应税服务规定的有
  • 汽车进口税率表
  • 详细解读财税[2014]75号文件
  • 餐饮发票一千多钱税
  • 金税三期能查几年前的发票
  • 药品增值税简易征收
  • 年初预提费用
  • 固定资产出售收入大于净值
  • 记账凭证是出纳编制吗
  • 土地增值税进项税
  • 如何在win7中查找文件
  • 如何输入特殊符号带圈数字11
  • 其他业务收入借贷方向
  • 科技三项费用拨款共计5000万元
  • 预收的购货款属于收入吗
  • thinkphp框架介绍
  • 详解Yii2.0 rules验证规则集合
  • 保姆级官方yolov7的训练自己的数据集以及项目部署
  • php文件上传用什么请求方法
  • div+css导航栏
  • Laravel 5.1 on SAE环境开发教程【附项目demo源码】
  • 一般纳税人销售自己使用过的汽车
  • 对公账号里面的钱会扣税吗
  • 发票报销可以跨年吗
  • ps魔棒工具选择图像时在容差数值较大的是
  • dedecms安装步骤
  • php 上传
  • 工业企业提供劳务
  • 不在经营范围内经营违反了什么法
  • 小规模纳税人免税额度是多少
  • 贸易企业出口退税计算方法
  • 异常凭证一定要转出吗
  • 其他应收款借方表示增加吗
  • 会计核算的作用,意义
  • 公司卖出货物没有发票
  • 费用提前预支的请示
  • 财务独立核算的条件
  • 银行结算账户的基本要求
  • 怎么开劳务派遣工作证明
  • 五证合一的办理流程是什么
  • mysql多字段排序原理
  • mysql5.0使用教程
  • 安装office提示
  • centos双网卡配置超详细
  • ubuntu怎样
  • win7家庭版开启administrator
  • mac怎么卸载苹果系统
  • 移动硬盘做win7系统盘
  • win10系统edge浏览器打不开解决办法
  • win10登陆背景修改器
  • Metaio in Unity3d 教程--- 四:再谈谈图片扫描之tracking配置文件
  • firefox允许弹出窗口
  • Node.js中的全局对象有
  • php操作dom
  • node中的事件循环
  • jQuery基于muipicker实现仿ios时间选择
  • 用js自动判断浏览记录
  • python动态加载py
  • python怎么写函数
  • jquery动态添加和删除div
  • 电子税务局的社保不能扣款怎么办
  • 建筑施工税务处理
  • 契税税收优惠政策2021
  • 一般纳税人销售收入分录
  • 2023年新乡契税补贴政策
  • 电子税务平台怎么红冲纸质发票
  • 开票盘注销后能否撤回
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设