Python笔记 - 运算符重载

在使用NumPy做一些数据处理的时候,发现NumPy的[]运算符其实和普通的python列表是不同的,意识到很可能是numpy做了运算符重载,查阅了一下果然如此。这篇笔记就介绍一下python中如何进行运算符重载.

Python重载运算符

在Python中,重载运算符(Operator Overloading)允许开发者为用户定义的类赋予特殊的行为。通过重载运算符,可以使自定义类的实例对象能够使用内置运算符(如 +, -, *, / 等)进行操作,从而提高代码的可读性和简洁性。本文将详细介绍Python中的运算符重载及其实现方法,并通过代码示例进行说明。

什么是运算符重载?

运算符重载是指为自定义类定义特殊方法,使得类实例对象可以使用标准运算符进行操作。例如,当我们重载了 + 运算符后,可以直接使用 + 运算符来合并两个对象。

重载运算符的方法

在Python中,运算符重载是通过定义特殊方法(或称为魔术方法)实现的。每个运算符对应一个特殊方法,这些方法的名字通常以双下划线开头和结尾。例如,+ 运算符对应的特殊方法是 __add__

以下是常用运算符及其对应的特殊方法:

  • + (加法):__add__
  • - (减法):__sub__
  • * (乘法):__mul__
  • / (除法):__truediv__
  • % (取模):__mod__
  • == (等于):__eq__
  • != (不等于):__ne__
  • < (小于):__lt__
  • > (大于):__gt__
  • [] (索引):__getitem____setitem__

代码示例

我们通过一个自定义的 Vector 类来演示如何重载运算符。

class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):return Vector(self.x + other.x, self.y + other.y)def __sub__(self, other):return Vector(self.x - other.x, self.y - other.y)def __mul__(self, scalar):return Vector(self.x * scalar, self.y * scalar)def __truediv__(self, scalar):return Vector(self.x / scalar, self.y / scalar)def __eq__(self, other):return self.x == other.x and self.y == other.ydef __getitem__(self, index):if index == 0:return self.xelif index == 1:return self.yelse:raise IndexError("Index out of range")def __setitem__(self, index, value):if index == 0:self.x = valueelif index == 1:self.y = valueelse:raise IndexError("Index out of range")def __repr__(self):return f"Vector({self.x}, {self.y})"

在上述代码中,我们定义了一个 Vector 类,并重载了几个常用的运算符:

  • __add__: 重载 + 运算符,用于向量加法。
  • __sub__: 重载 - 运算符,用于向量减法。
  • __mul__: 重载 * 运算符,用于向量与标量的乘法。
  • __truediv__: 重载 / 运算符,用于向量与标量的除法。
  • __eq__: 重载 == 运算符,用于比较两个向量是否相等。
  • __getitem____setitem__: 重载 [] 运算符,用于通过索引访问和设置向量的分量。

使用示例

下面是如何使用这些重载运算符的示例:

v1 = Vector(2, 3)
v2 = Vector(4, 5)# 向量加法
v3 = v1 + v2
print(v3)  # 输出: Vector(6, 8)# 向量减法
v4 = v1 - v2
print(v4)  # 输出: Vector(-2, -2)# 向量与标量的乘法
v5 = v1 * 2
print(v5)  # 输出: Vector(4, 6)# 向量与标量的除法
v6 = v2 / 2
print(v6)  # 输出: Vector(2.0, 2.5)# 比较两个向量是否相等
print(v1 == v2)  # 输出: False
print(v1 == Vector(2, 3))  # 输出: True# 使用索引访问和设置向量的分量
print(v1[0])  # 输出: 2
print(v1[1])  # 输出: 3
v1[0] = 10
v1[1] = 20
print(v1)  # 输出: Vector(10, 20)

总结

通过运算符重载,可以使自定义类的实例对象具备与内置类型相似的操作能力,从而使代码更加简洁和易读。本文介绍了运算符重载的基本概念,并通过一个 Vector 类的示例演示了如何重载常用运算符。在实际开发中,合理使用运算符重载可以大大提高代码的可维护性和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853179.shtml

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

相关文章

使用gtest做cpp的单元测试并可查看代码覆盖率

前言 由于工作需要&#xff0c;要使用googletest做单元测试&#xff0c;本文记录下搭建gtest单元测试环境&#xff0c;并查看代码覆盖率的方法&#xff0c;以备不时之需。 准备工作 编译gtest 克隆gtest源码&#xff1a; git clone https://github.com/google/googletest.g…

公司面试题总结(三)

13.说说你对 BOM 的理解&#xff0c;常见的 BOM 对象你了解哪些&#xff1f; BOM (Browser Object Model)&#xff0c;浏览器对象模型&#xff0c; ⚫ 提供了独立于内容与浏览器窗口进行交互的对象 ⚫ 其作用就是跟浏览器做一些交互效果 ⚫ 比如如何进行页面的后退&…

VIRT高是因为分配了太多地址空间导致。

一般来说不用太在意VIRT太高&#xff0c;因为你有16EB的空间可以使用。 如果你实在需要控制VIRT的使用&#xff0c;设置环境变量MALLOC_ARENA_MAX&#xff0c;例如: hadoop推荐值为4&#xff0c;因为YARN使用VIRT值监控资源使用。 解决办法就是&#xff1a; export MALLOC_AR…

C语言中的枚举类型(enum)是如何定义的

在C语言中&#xff0c;枚举类型&#xff08;enum&#xff09;是一种用户定义的数据类型&#xff0c;它允许为整数值指定一个易读的名字。枚举类型通常用于表示固定数量的可能值&#xff0c;例如一周的七天或颜色的集合。 枚举类型的定义使用关键字 enum&#xff0c;后面跟着枚…

QUIC 和 TCP: 深入解析为什么 QUIC 更胜一筹

引言 在过去的三十年里&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;一直是互联网的支柱。我们可以通过 HTTP 浏览网页、下载文件、流式传输电影等。这一协议随着时间的推移已经得到了重大改进。 HTTP 协议是一个应用层协议&#xff0c;它基于 TCP&#xff08;传输…

【git使用一】windows下git下载、安装和卸载

目录 &#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09;安装git &#xff08;3&#xff09;安装验证 &#xff08;4&#xff09;卸载git &#xff08;1&#xff09;下载安装包 官网下载地址&#xff1a;Git 国内镜像下载地址&#xff1a;CNPM Binaries Mir…

Unity图集

概述 相信在同学们学习过程中&#xff0c;在UI的的使用时候一定经常听说过图集的概念。 Unity有UI的组件&#xff0c;有同学们好奇&#xff0c;那为什么还要使用图集呢&#xff1f; 这就需要提到一个性能优化的问题了&#xff0c;因为过多的UI图片&#xff0c;会大幅增加Dra…

【机器学习】LightGBM: 优化机器学习的高效梯度提升决策树

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 LightGBM: 优化机器学习的高效梯度提升决策树引言一、LightGBM概览二、核心技术…

buildroot编译出错you should not run configure as root

虚拟机版本&#xff1a;ubuntu-22.04.4 问题 buildroot在图形配置后&#xff0c;执行 sudo make开始编译出现以下错误configure: error: you should not run configure as root (set FOenvironment to bypass this check) 在网上看到说在/etc/profile文件中添加以下内容 exp…

火车头采集织梦发布模块插件下载及教程

火车头采集网页数据发布到织梦CMS&#xff08;DeDeCMS&#xff09;系统操作步骤如下&#xff1a; 1. 火车头采集织梦DeDeCMS发布模块下载安装 百度网盘&#xff1a;火车头采集织梦CMS发布插件下载地址 提取码&#xff1a;414h 2. 在火车头采集软件导入织梦De…

MAC系统下安装VUE

下载node.js 点击链接 选择图片中的稳定版本 安装node.js 打开终端&#xff0c;输入 node -v 和 npm -v 显示如上信息表示安装成功 安装vue脚手架&#x1f527; sudo npm install -g vue/cli查看vue版本 vue -V6. 启动项目 1 采用 图形页面方式 控制台输入&#xff…

MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?

一. 问题描述 我们在设计表结构的时候&#xff0c;设计规范里面有一条如下规则: 对于可变长度的字段&#xff0c;在满足条件的前提下&#xff0c;尽可能使用较短的变长字段长度。 为什么这么规定&#xff1f;我在网上查了一下&#xff0c;主要基于两个方面 基于存储空间的考…

C# Winform 用户控件,扩展控件,自定义控件综合实例

Control类是Windows窗体控件的基类&#xff0c;它提供了在 Windows 窗体应用程序中进行可视显示所需的基础结构&#xff0c;可以通过继承来扩展熟悉的用户控件和现有控件的功能。本列介绍三种不同自定义控件以及怎么创建他们。 自定义控件分类 用户控件&#xff1a;基本控件的…

IT入门知识博客文章大纲第二部分《编程语言》(2/10)

目录 IT入门知识博客文章大纲第二部分《编程语言》 1.引言 2.编程语言概述 2.1 编程语言的发展历程 2.2 编程范式 3.常见的编程语言 3.1 Python 3.2 Java 3.3 C 3.4 JavaScript 3.5 Ruby 4.编程语言的选择 4.1 技术需求 4.2 团队技能 4.3 社区和生态系统 4.4 可…

Python也能“零延迟“通信吗?ZeroMQ带你开启高速模式!

目录 1、零基础入门ZeroMQ 🚀 1.1 ZeroMQ简介与安装 1.2 基础概念:Socket类型详解 1.3 实战演练:Hello World示例 2、深入浅出消息模式 🔌 2.1 请求-应答模式( REQ/REP ) 2.2 发布-订阅模式( PUB/SUB ) 2.3 推送-拉取模式( PUSH/PULL ) 3、Python实战ZeroM…

Aptos Builder Jam 亚洲首站|议程公布,无限畅想 Aptos 生态未来

作为一个新兴的 Layer1 公链&#xff0c;Aptos 自诞生之日起的理想便是 “A Layer 1 for everyone” 当 Web3 深陷熊市阴影之时&#xff0c;Aptos 奋力为开发者找到了全新的技术路径&#xff0c;正有 200 项目正在开发&#xff0c;并且已有大量 DeFi 项目落实部署工作&#xff…

C语言实现卡尔曼滤波器(Kalman Filter)

C语言实现卡尔曼滤波器(Kalman Filter) 理论知识参考卡尔曼滤波器 C语言实现 //KalmanFilter 结构体定义了卡尔曼滤波器的参数和状态变量。 //kalman_init 函数用于初始化卡尔曼滤波器的参数。 //kalman_update 函数实现了卡尔曼滤波器的预测和更新步骤。 //main 函数演示了…

AWS无服务器 应用程序开发—第十一章API Gateway

API Gateway 是 AWS 提供的一种托管服务,用于创建、发布、维护、保护和监控 RESTful 和 WebSocket API。它可以帮助开发者构建可扩展的微服务架构,并提供了丰富的功能来管理 API 的生命周期和流量。 主要功能和特点: API 创建和管理: 可以使用 API Gateway 快速创建和定…

shell文本三剑客 awk 和 grep

awk 前言 AWK是一种优良的文本处理工具。它不仅是 Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。 Linux中最常用的文本处理工具有grep&#xff0c;sed&#xff0c;awk。行内将之称为文本三剑客&#xff0c;就功能量和效率来看&#xff0c;awk是当之无愧的文本三…

强化学习-tutorial

强化学习 当你发现收集有标注的数据困难&#xff0c;正确答案人类也不知道是什么的时候&#xff0c;往往是考虑使用RL的时候。尽管机器不知道答案是什么&#xff0c;但是机器会知道什么好&#xff0c;什么不好&#xff0c;通过与环境互动获得奖励。 过程 演算法解RL问题&…