Python运算符重载及其可重载运算符

2023-11-08

每个类型都有其独特的操作方法,例如列表类型支持直接做加法操作实现添加元素的功能,字符串类型支持直接做加法实现字符串的拼接功能,也就是说,同样的运算符对于不同序列类型的意义是不一样的,这是怎么做到的呢?

其实在 Python 内部,每种序列类型都是 Python 的一个类,例如列表是 list 类,字典是 dict 类等,这些序列类的内部使用了一个叫作“重载运算符”的技术来实现不同运算符所对应的操作。

所谓重载运算符,指的是在类中定义并实现一个与运算符对应的处理方法,这样当类对象在进行运算符操作时,系统就会调用类中相应的方法来处理。

这里给大家举一个与重载运算符相关的实例:

class MyClass: #自定义一个类
    def __init__(self, name , age): #定义该类的初始化函数
        self.name = name #将传入的参数值赋值给成员交量
        self.age = age
    def __str__(self): #用于将值转化为字符串形式,等同于 str(obj)
        return "name:"+self.name+";age:"+str(self.age)
   
    __repr__ = __str__ #转化为供解释器读取的形式
   
    def __lt__(self, record): #重载 self<record 运算符
        if self.age < record.age:
            return True
        else:
            return False
   
    def __add__(self, record): #重载 + 号运算符
        return MyClass(self.name, self.age+record.age)

myc = MyClass("Anna", 42) #实例化一个对象 Anna,并为其初始化
mycl = MyClass("Gary", 23) #实例化一个对象 Gary,并为其初始化
print(repr(myc)) #格式化对象 myc,
print(myc) #解释器读取对象 myc,调用 repr
print (str (myc)) #格式化对象 myc ,输出"name:Anna;age:42"
print(myc < mycl) #比较 myc<mycl 的结果,输出 False
print (myc+mycl) #进行两个 MyClass 对象的相加运算,输出 "name:Anna;age:65"

输出结果为:

name:Anna;age:42
name:Anna;age:42
name:Anna;age:42
False
name:Anna;age:65

这个例子中,MyClass 类中重载了 repr、str、<、+ 运算符,并用 MyClass 实例化了两个对象 myc 和 mycl。

通过将 myc 进行 repr、str 运算,从输出结果中可以看到,程序调用了重载的操作符方法 __repr__ 和 __str__。而令 myc 和 mycl 进行 < 号的比较运算以及加法运算,从输出结果中可以看出,程序调用了重载 < 号的方法 __lt__ 和 __add__ 方法。

那么,Python 类支持对哪些方法进行重载呢?这个给大家提供一个表格(表 1),列出了 Python 中常用的可重载的运算符,以及各自的含义。

表 1 Python 常用重载运算符
重载运算符 含义
__new__ 创建类,在 __init__ 之前创建对象
__init__ 类的构造函数,其功能是创建类对象时做初始化工作。
__del__  析构函数,其功能是销毁对象时进行回收资源的操作
__add__ 加法运算符 +,当类对象 X 做例如 X+Y 或者 X+=Y 等操作,内部会调用此方法。但如果类中对 __iadd__ 方法进行了重载,则类对象 X 在做 X+=Y 类似操作时,会优先选择调用 __iadd__ 方法。
__radd__ 当类对象 X 做类似 Y+X 的运算时,会调用此方法。
__iadd__ 重载 += 运算符,也就是说,当类对象 X 做类似 X+=Y 的操作时,会调用此方法。
__or__ “或”运算符 |,如果没有重载 __ior__,则在类似 X|Y、X|=Y 这样的语句中,“或”符号生效
__repr__,__str__ 格式转换方法,分别对应函数 repr(X)、str(X)
__call__ 函数调用,类似于 X(*args, **kwargs) 语句
__getattr__ 点号运算,用来获取类属性
__setattr__ 属性赋值语句,类似于 X.any=value
__delattr__ 删除属性,类似于 del X.any
__getattribute__ 获取属性,类似于 X.any
__getitem__ 索引运算,类似于 X[key],X[i:j]
__setitem__ 索引赋值语句,类似于 X[key], X[i:j]=sequence
__delitem__  索引和分片删除
__get__, __set__, __delete__ 描述符属性,类似于 X.attr,X.attr=value,del X.attr
__len__  计算长度,类似于 len(X)
__lt__,__gt__,__le__,__ge__,__eq__,__ne__  比较,分别对应于 <、>、<=、>=、=、!= 运算符。
__iter__,__next__ 迭代环境下,生成迭代器与取下一条,类似于 I=iter(X) 和 next()
__contains__ 成员关系测试,类似于 item in X
__index__  整数值,类似于 hex(X),bin(X),oct(X)
__enter__,__exit__ 在对类对象执行类似 with obj as var 的操作之前,会先调用 __enter__ 方法,其结果会传给 var;在最终结束该操作之前,会调用 __exit__ 方法(常用于做一些清理、扫尾的工作)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python运算符重载及其可重载运算符 的相关文章

  • 如果两点之间的距离低于某个阈值,则从列表中删除点

    我有一个点列表 只有当它们之间的距离大于某个阈值时 我才想保留列表中的点 因此 从第一个点开始 如果第一个点和第二个点之间的距离小于阈值 那么我将删除第二个点 然后计算第一个点和第三个点之间的距离 如果该距离小于阈值 则比较第一点和第四点
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • 问题 C: 括号匹配

    题目描述 给你一个字符串 里面只包含 四种符号 请问你需要至少添加多少个括号才能使这些括号匹配起来 如 是匹配的 是匹配的 是不匹配的 是不匹配的 输入 第一行输入一个正整数N 表示测试数据组数 N lt 10 每组测试数据都只有一行 是一
  • 调试最长的一帧(第14天)

    看看流程 可见分页数据库的更新也是和场景的筛选绘制是同时进行的 再看看大图 第14天要进行左下角的 依照惯例 跟过去 现在开始步入正轨 发现第0个fileName为空 这是有问题的 创建pagelod时修正为 这次进来了 在这里删除 放入r
  • HTML5+CSS3D酷炫相册

    HTML5 CSS3D酷炫相册 图片预览 目录结构 源码 HTML
  • 2:数据结构复习线性表(一般集合的并集:链式解决方案)

    线性表的合并 例2 1 求解一般集合的并集问题 问题描述 已知两个集合A和B 现要求一个新的集合A AUB 例如 设 A 7 5 3 11 B 2 6 3 合并后 A 7 5 3 11 2 6 问题分析 可以利用两个线性表LA和LB分别表示
  • 数组最大连续子序列和

    题目 给定一个数组 其中元素可正可负 求其中最大连续子序列的和 这题是一道非常经典的面试题 会经常出现在各种面试中 具体有好几种不同时间复杂度的解法 那么最好的方法是用动态规划方法来求解 第一种 时间复杂度为O n 3 暴力法求解 三层循环
  • events.js:183 throw er; // Unhandled 'error' event 相关问题解决办法

    在启动项目的时候可能会出现以下问题 出现原因 出现这个问题的主要原因是因为端口被占用了 解决办法 查询端口号是否被占用 netstat aon findstr 8000 找到对应程序 tasklist findstr 9060 再任务管理器
  • 2015款Mac笔记本安装Windows10系统到外置移动硬盘教程

    终于把2015年的15寸Macbook Pro笔记本安装上了Windows10操作系统 并且是在外置的移动硬盘上安装的 运行的效果和用户体验也是非常棒 之前网上购买了加密的视频 但是这个视频必须是windows系统 还不能是虚拟机里面的系统
  • QT关键问题解决之paintevent理解

    基础概念 paintEvent QPaintEvent 函数是QWidget类中的虚函数 用于ui的绘制 会在多种情况下被其他函数自动调用 比如update 时 运行时机 一个重绘事件用来重绘一个部件的全部或者部分区域 下面几个原因的任意一
  • 中移动 NB-IoT (M5310-A)学习笔记

    一 来自 M5310 A硬件设计手册V1 5 DCE Data Communication EquipmentDTE Data Terminal Equipment 模块的三种工作模式 模式 描述 Active 模块处于活动状态 所有功能正
  • CreateFile之类的几个函数

    这几天看windows API一日一练 博主给画出了道道 我来填填具体点的内容 需求 想操作文件 串口 并口 USB等等 原理层 其实很简单 就三步 打开 操作 然后关闭 实践层1 打开用CreateFile 读写操作用WriteFile
  • 宝塔面板部署nginx+springboot+netty

    nginx配置集成netty的springboot前后端分离项目 项目环境 CentOS 7 9 宝塔面板 nginx1 21 前后端分离项目按照日常部署方式部署到服务器 前往nginx配置文件nginx conf 配置TCP socket
  • 两台机器之间同步时间,并修改服务器层级

    作业a 第一台机器从阿里云同步时间 第二台机器从第一台机器同步时间 第一台机器配置 vim etc chrony conf 修改第一台机器的配置文件 将原有的pool注释掉 并添加阿里云时钟源 gt server ntp aliyun co
  • C++实现两个字符串交替组合成一个字符串

    引言 这道题来自力扣 给出两个字符串 将两个字符串交替着组合成一个字符串 如 string str1 abcd string str2 hb string str ahbbcd string str1 abcd string str2 hb
  • kafka高性能设计:内存池

    前言 Kafka的内存池是一个用于管理内存分配的缓存区域 它通过在内存上保留一块固定大小的内存池 用于分配消息缓存 批处理缓存等对象 以减少频繁调用内存分配函数的开销 Kafka内存池的实现利用了Java NIO中的 ByteBuffer
  • 罗技键盘连计算机,罗技键盘怎么连接电脑

    罗技蓝牙键盘连接电脑需装入电池 打开电源开关 转动拨盘至 1 位置 然后长按 PC 键3秒进入 搜索 模式 打开电脑 前往 设置 设备 蓝牙和其他设备 打开 蓝牙 在蓝牙搜索列表中选中罗技蓝牙键盘的名称 确认配对即可完成连接 本文以惠普光影
  • 搭建tcp客户端,双进程实现tcp服务端客户端随时收发,udp服务端客户端

    tcp客户端 include
  • HTML+CSS简易淘宝页面

    效果图 效果图中的图片可以去我微信公众号新白者 回复照片就行 HTML代码 注意这个外部链接引入css的名字与自己的相同 div div div a a div div div
  • 自动化测试开发 —— 如何封装自动化测试框架?

    封装自动化测试框架 测试人员不用关注框架的底层实现 根据指定的规则进行测试用例的创建 执行即可 这样就降低了自动化测试门槛 能解放出更多的人力去做更深入的测试工作 本篇文章就来介绍下 如何封装自动化测试框架 1 明确自动化测试框架需求 支持
  • 两数相加—思路和心得

    题目链接 https leetcode cn com problems add two numbers Definition for singly linked list public class ListNode int val List
  • Python运算符重载及其可重载运算符

    每个类型都有其独特的操作方法 例如列表类型支持直接做加法操作实现添加元素的功能 字符串类型支持直接做加法实现字符串的拼接功能 也就是说 同样的运算符对于不同序列类型的意义是不一样的 这是怎么做到的呢 其实在 Python 内部 每种序列类型