Python 中的 NotImplemented 和 NotImplementedError

news2024/11/23 12:18:01

前言

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

NotImplemented

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

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

class MyClass:
    def __init__(self, value):
        self.value = value
 
    def __add__(self, other):
        if isinstance(other, MyClass):
            return MyClass(self.value + other.value)
        elif isinstance(other, int):
            return MyClass(self.value + other)
        else:
            return NotImplemented
     
    def __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 = value
 
    def __add__(self, other):
        if isinstance(other, MyClass):
            return MyClass(self.value + other.value)
        elif isinstance(other, int):
            return MyClass(self.value + other)
        else:
            raise NotImplementedError
     
    def __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 = value

    def __eq__(self, other):
        if isinstance(other, A):
            # 只能和 A 类型进行比较
            return self.value == other.value
        else:
            return NotImplemented


class B:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        if isinstance(other, A):
            # 支持和 A 类型进行比较
            return self.value == other.value
        elif isinstance(other, B):
            return self.value == other.value
        else:
            return NotImplemented

a = 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://www.coloradmin.cn/o/1966182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP 和 UDP 之间的区别?

从 连接&#xff0c;可靠性&#xff0c;传输方式等方面&#xff1a; TCP 是面向连接的协议&#xff0c;在发送数据的时候需要先通过 TCP 的三次握手&#xff0c;而 UDP 是无连接的协议&#xff0c;可以直接传输数据TCP 通过超时重传&#xff0c;流量控制和拥塞控制等方法保障了…

聚芯前行|美格智能亮相2024 ChinaJoy骁龙主题馆,展现数字娱乐的无限可能

7月26日&#xff0c;2024中国国际数码互动娱乐展览会&#xff08;ChinaJoy&#xff09;在上海新国际博览中心正式拉开帷幕。美格智能携手高通公司亮相骁龙主题馆&#xff0c;以5G-A毫米波MiFi解决方案及高算力AI模组&#xff0c;共同为广大玩家和粉丝打造了一个前沿技术赋能、充…

Vivo手机怎么录屏?教你操作,vivo手机完美录屏攻略

随着智能手机的普及&#xff0c;录屏功能成为了我们日常生活和工作中不可或缺的一部分。vivo手机作为一款备受欢迎的智能手机品牌&#xff0c;拥有着许多实用的工具和丰富的功能&#xff0c;其中包括强大的录屏功能。本文将为您详细介绍2种vivo手机怎么录屏的方法。无论您是想分…

找工作很迷茫?程序员的岗位宝典来了!

随着数字化转型进展深入&#xff0c;大量数字化、智能化的岗位相继涌现。 但即使这样&#xff0c;大家依然认为&#xff0c;找到一份合适的工作实在是太&#xff01;难&#xff01;了&#xff01; 调查显示&#xff0c;技术创新和商业模式正在成为助推企业发展的两大动力。同时…

TOSHIBA东芝代理商--芯智雲城,提供订货、报价、选型等服务!

关于东芝 东芝创立于1875年7月&#xff0c;是日本大型半导体制造商&#xff0c;全球知名的综合机电制造商和解决方案提供者&#xff0c;世界大型综合电子电器企业集团。东芝集团原名东京芝浦电气株式会社&#xff0c;在1939年东京电器与芝浦制作所正式合并成为现在的东芝&…

想不到WhaleStudio和Talend的差异竟如此之大!

最近我们遇到很多客户需求是把Talend迁移到WhaleStudio&#xff0c;主要是发现WhaleStudio支持的数据源多很多&#xff0c;从各个版本的SAP到AWS Redshift&#xff0c;S3&#xff0c;从MangoDB CDC到 Neo4J甚至各种国产信创数据源&#xff0c;可谓应有尽有。同时&#xff0c;客…

ROC曲线的一点理解

1 背景知识 真阳率&#xff08;TPR&#xff09;和假阳率&#xff08;FPR&#xff09;&#xff1a; 真阳率&#xff08;TPR&#xff09;&#xff1a;又称召回率&#xff08;Recall&#xff09;&#xff0c;计算公式为 ​&#xff0c;表示实际为正的样本中被正确分类为正的比例…

STC12C5A60S2单片机输出pwm的方法

所谓的pwm输出就是让单片机在某个管脚上按照时间输出特定频率和占空比的矩形方波。这里面有两个参数&#xff0c;一是频率&#xff0c;二是占空比。两者互不干涉。以STC12C5A60S2为例子&#xff0c;本51型单片机可以有两路pwm输出。以其中的一路为例说明&#xff1b; 首先说频…

专题八_分治-归并

目录 912. 排序数组 解析 题解 LCR 170. 交易逆序对的总数(数组中的逆序对) 解析 题解 315. 计算右侧小于当前元素的个数 解析 题解 493. 翻转对 解析 题解 912. 排序数组 912. 排序数组 解析 题解 1.局部临时数组 class Solution { public:vector<int> so…

换地不换IP?揭秘微博IP地址的奥秘

在这个信息飞速传递的时代&#xff0c;社交媒体成为我们生活中不可或缺的一部分。微博&#xff0c;作为其中的佼佼者&#xff0c;不仅是我们获取资讯的重要渠道&#xff0c;也是展现自我、分享生活的重要平台。然而&#xff0c;你有没有遇到过这样的情况&#xff1a;明明已经换…

智能相机背后的图像防抖(IS)技术介绍

智能相机背后的图像防抖(IS)技术介绍 在现代摄影和视频拍摄中&#xff0c;防抖技术已成为必不可少的一部分。随着智能手机、相机和其他成像设备的普及&#xff0c;防抖技术的需求也越来越高。本文将详细介绍几种主要的防抖技术&#xff0c;包括光学防抖&#xff08;OIS&#x…

【Redis 初阶】客户端(C++ 使用样例列表)

一、编写 helloworld 需要先使用 redis-plus-plus 连接一下 Redis 服务器&#xff0c;再使用 ping 命令检测连通性。 1、Makefile Redis 库最多可以支持到 C17 版本。&#xff08;如果是用 Centos&#xff0c;需要注意 gcc/g 的版本&#xff0c;看是否支持 C17。不支持的话&a…

【第五节】python异常处理

目录 一、python中的异常用法 1.1 try-except 1.2 异常处理流程&#xff1a; 1.3 try-finally 1.4 使用except是否指定异常 二、异常的参数 三、自定义异常 四、常见的异常列举 一、python中的异常用法 异常是指程序运行过程中出现的非正常状态。在Python编程中&#x…

线程的创建Linux下

进程的创建&#xff1a;第一个参数通常传递一个pthread_t 的地址&#xff0c;第二个参数为线程的属性&#xff0c;第三个参数为函数指针&#xff0c;是子线程要做的事情。arg是函数指针所对应函数的参数。 sleep主要是为了等待子线程退出&#xff0c;因为当主线程退出时&#x…

WebSocket connection to ‘ws://x.x.x.x:8080/ws‘ failed:报错

vue.config.js中进行修改 添加 devServer: { Proxy: {ws:false }}

Flink-StarRocks详解:第二部分(第52天)

文章目录 前言2. 表设计2.1 StarRocks表设计2.1.1 列式存储2.1.2 索引2.1.3 加速处理2.1.3.1 预先聚合2.1.3.2 分区分桶2.1.3.3 物化视图2.1.3.4 列级索引 2.2 数据模型2.2.1 明细模型2.2.1.1 适用场景2.2.1.2 创建表2.2.1.3 使用说明 2.2.2 聚合模型2.2.2.1 适用场景2.2.2.2 原…

[C++] vector对比list deque的引出

文章目录 list与vector的对比双端队列dequedeque的特性deque的底层实现原理内存结构块表&#xff08;Block Array&#xff09;块&#xff08;Block&#xff09; 插入与删除两端插入两端删除 随机访问如何计算位置 迭代器设计 总结 list与vector的对比 vector与list都是STL中非…

实战AR增强现实【OpenCV+Ogre】

作为一份小小的礼物&#xff0c;我想向你展示借助 Ogre 和 OpenCV 自己制作增强现实变得多么容易。你应该知道&#xff0c;除了图形之外&#xff0c;我的另一个兴趣是计算机视觉。 演示将不依赖于 ARCore 或 ARKit 等专有解决方案 - 所有这些都将使用开源代码完成&#xff0c;…

【ROS2】 默认的DDS通信中间件替换为Eclipse Cyclone_DDS (DDS配置方法)

ROS2替换中间件为Cyclone_DDS 1.一些介绍&#xff1a;&#xff09;2.不同DDS的RMW实现3.默认的FastDDS替换为Cyclone DDSi.安装依赖ii.编译 cyclone-dds 4.配置网络 1.一些介绍&#xff1a;&#xff09; 上一篇我们探讨了ros1和ros2编写launch的区别 【ROS2】launch启动文件编…