当前位置: 首页 > news >正文

Python 中的 NotImplemented 和 NotImplementedError

前言

Python 中的 NotImplementedNotImplementedError 很像,都用来表示没有实现的意思。它们具体有什么区别呢?

NotImplemented

NotImplemented 是 Python 中的一个特殊常量,注意它不是一个异常类,是一个值。所以它是用在 return 后面,而不是 raise。它是 types.NotImplementedType 类型的唯一实例。

它主要用于重载自定义二元方法中,如 __add__, __eq____lt__ 等,这些方法用于定义类实例的相加(+)、相等(==)、小于(<)等比较操作。当方法返回 NotImplemented 时,表示这个操作是没有实现的。

class MyClass:def __init__(self, value):self.value = valuedef __add__(self, other):if isinstance(other, MyClass):return MyClass(self.value + other.value)elif isinstance(other, int):return MyClass(self.value + other)else:return NotImplementeddef __str__(self):return str(self.value)a = MyClass(3)
b = 2
c = a + b  # c 的值为 5,因为处理了 int 类型
d = a + "test"  # 会报 TypeError,因为返回了 NotImplemented

在这里插入图片描述

NotImplementedError

NotImplementedError 是 Python 内置的异常类,通过 raise 抛出,用于表示一个方法或函数没有被实现。通常可以用于抽象基类的抽象方法中,让子类必须去覆盖方法。

class MyAbstractClass:def my_abstract_method(self):raise NotImplementedError("子类必须实现这个方法")class MyConcreteClass(MyAbstractClass):def my_abstract_method(self):# 实现具体的方法pass

当然二元操作符方法也可以抛出这个异常。

class MyClass:def __init__(self, value):self.value = valuedef __add__(self, other):if isinstance(other, MyClass):return MyClass(self.value + other.value)elif isinstance(other, int):return MyClass(self.value + other)else:raise NotImplementedErrordef __str__(self):return str(self.value)a = MyClass(3)
b = 2
c = a + b  # c 的值为 5,因为处理了 int 类型
d = a + "test"  # 会报 NotImplementedError,因为抛出了这个异常

在这里插入图片描述

对比

那么为什么要同时有 NotImplemented 和 NotImplementedError 呢?它们有什么区别呢?

看看以下代码:

class A:def __init__(self, value):self.value = valuedef __eq__(self, other):if isinstance(other, A):# 只能和 A 类型进行比较return self.value == other.valueelse:return NotImplementedclass B:def __init__(self, value):self.value = valuedef __eq__(self, other):if isinstance(other, A):# 支持和 A 类型进行比较return self.value == other.valueelif isinstance(other, B):return self.value == other.valueelse:return NotImplementeda = A(3)
b = B(3)
print(a == b) # True
c = B(2)
print(a == c) # False

在类 A 上并没有定义与 B 类型的比较方法,但是却并没有报错,而是执行了 B 的判断方法。这就是 NotImplemented 对象的作用。 它向解释器发出一个信号,告诉解释器如果当前操作失败,它应该再检查一下其他可行方法。例如在 a == b 表达式,如果 a.__eq__(b) 返回 NotImplemented,那么 Python 会尝试 b.__eq__(a)。如果调用 b 的 __eq__() 方法可以返回 True 或者 False,那么该表达式就成功了。如果 b.__eq__(a) 也不能得出结果,那么 Python 会继续尝试其他方法,例如使用 != 来比较。

因此,NotImplemented 对象和 NotImplementedError 异常适用于两个不同的场景。NotImplemented 用于部分二元重载操作符方法,可以让解释器尝试找到最适合的方法来计算结果,特别是对于一些三方的类和我们自己的类进行操作,我们就不需要修改它们的源码,在我们自己的类中添加对应的处理逻辑即可。而 NotImplementedError 异常则用于抽象类的抽象方法中,用于告诉子类,这个方法必须要覆盖。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTTP协议详解(一)
  • 并发编程工具集——Future(二十七)
  • 【CPS出版】2024年智能计算与数据分析国际学术会议(ICDA 2024,9月6日-8)
  • 压缩技巧:word怎么压缩到10m以下?word压缩,快速学会的5个高效方法!
  • vue el-input 输入框下拉显示匹配数据
  • 一文带你掌握C++异常处理
  • FPGA开发——数码管的使用(二)
  • 敏捷开发笔记(第14章节)--TEMPLATE METHOD模式和STRATEGY模式:继承与委托
  • 【第四节】python面向对象
  • 基于 LangChain 开发应用程序第七章-代理
  • 781页 | 2024全国数据资产政策法规汇编(可下载)
  • 富唯智能转运机器人:高效、智能、未来的选择
  • 代码随想录算法训练营第二十六天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
  • 11部门公布第二批国家数字乡村试点地区名单
  • uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功
  • .pyc 想到的一些问题
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Akka系列(七):Actor持久化之Akka persistence
  • HashMap ConcurrentHashMap
  • Java IO学习笔记一
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Linux下的乱码问题
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Node + FFmpeg 实现Canvas动画导出视频
  • nodejs调试方法
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 离散点最小(凸)包围边界查找
  • 聊聊directory traversal attack
  • 前端_面试
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 我的业余项目总结
  • 用Python写一份独特的元宵节祝福
  • 正则表达式
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #13 yum、编译安装与sed命令的使用
  • #nginx配置案例
  • #QT(一种朴素的计算器实现方法)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)STL算法之遍历容器
  • (3)选择元素——(17)练习(Exercises)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .net 反编译_.net反编译的相关问题
  • .NET构架之我见
  • @Autowired和@Resource的区别
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • @Resource和@Autowired的区别