首页 > 编程语言 >12 Python面向对象编程:运算符重载

12 Python面向对象编程:运算符重载

时间:2024-09-05 09:48:16浏览次数:11  
标签:__ Vector Python self repr 运算符 other 面向对象编程

本篇是 Python 系列教程第 12 篇,更多内容敬请访问我的 Python 合集

在理解运算符重载之前我们已经知道了什么是方法重载,方法重载就是子类继承父类并且定义了一个和父类一样的方法。

知道了什么是重载,也知道了什么是运算符(加减乘除等),那么运算符重载也很好理解了,其实就是在类里面也定义一些特殊方法,使得调用这些方法能实现类对象的加减乘除。当然方法名不是随意取的,要和运算符对应上。

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

  1. 加法 (+): __add__(self, other)
  2. 减法 (-): __sub__(self, other)
  3. 乘法 (*): __mul__(self, other)
  4. 除法 (/): __truediv__(self, other)
  5. 求模 (%): __mod__(self, other)
  6. 幂 (**): __pow__(self, other[, modulo])
  7. 比较 (==): __eq__(self, other)
  8. 小于 (<): __lt__(self, other)
  9. 大于 (>): __gt__(self, other)
  10. 反向运算符(例如 a + b 中的 b + a): __radd__(self, other)

这里有一个简单的例子,展示了一个类如何重载加法运算符:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

# 创建两个向量实例
v1 = Vector(1, 2)
v2 = Vector(3, 4)

# 使用加法运算符
result = v1 + v2
print(result)  # 输出: Vector(4, 6)

在这个例子中,我们定义了一个Vector类,并实现了__add__方法来处理加法运算。此外,我们还定义了__repr__方法以便打印出对象的可读表示形式。关于__repr__方法的介绍请看文章末尾。

拓展

__repr__ 方法不是典型的运算符重载方法,但它确实是一种特殊的方法,用于定义对象的“官方”字符串表示形式。这个方法通常用于调试和开发目的,因为它提供了关于对象的尽可能完整的信息。

当没有定义 __str__ 方法时,print()str() 会调用 __repr__ 方法来获取对象的字符串表示。即使定义了 __str__ 方法,__repr__ 也可以被直接调用,比如使用 repr() 函数。

我们在上面的例子中做一个拓展:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"repr Vector({self.x}, {self.y})"

    def __str__(self):
        return f"str Vector({self.x}, {self.y})"

# 创建两个向量实例
v1 = Vector(1, 2)
v2 = Vector(3, 4)

# 使用加法运算符
result = v1 + v2
print(result)       # 输出: str Vector(4, 6)
print(repr(result)) # 输出:repr Vector(4, 6)

在这个例子中,__repr__ 被用来返回一个包含 xy 坐标的字符串,这使得输出更具可读性。

虽然 __repr__ 不是用来重载算术或比较运算符的,但它可以被认为是一种形式的“方法重载”,因为它允许你自定义对象如何被转换成字符串形式。如果你有任何关于 __repr__ 或者其他特殊方法的具体问题,请随时提问!

标签:__,Vector,Python,self,repr,运算符,other,面向对象编程
From: https://www.cnblogs.com/GilbertDu/p/18397768

相关文章

  • 13 Python面向对象编程:装饰器
    本篇是Python系列教程第13篇,更多内容敬请访问我的Python合集Python装饰器是一种强大的工具,用于修改或增强函数或方法的行为,而无需更改其源代码。装饰器本质上是一个接收函数作为参数的函数,并返回一个新的函数。装饰器的用途包括日志记录、性能测试、事务处理、缓存、权......
  • 用python编写web 界面可以用哪些库
    背景:很多人熟悉python,但不熟悉前端语言js,为了项目快速落地,也不太想去专门学习React/Angular/Vue这些框架,那么就会问一个问题,能不能用Python直接写出一个简单web界面呢?答案是可以的,而且有多种框架可以用。常见的有下面的几种,可自行搜索学习,选用适合自己的 PlotlyDash,基......
  • python2
    /转义字符,告诉python输入的符号就是符号本身,没有其他的含义join函数输入字符串,需要用str()进行转换功能:join:用于将一个可迭代对象(如列表或元组)中的元素连接成一个字符串。它需要一个字符串作为分隔符。append:用于向列表的末尾添加一个元素。它直接修改原列表。......
  • 【Python学习笔记】 第2章 Python如何运行程序
    Python解释器简介我们在Python的官网下载并安装Python后,它会生成一些组件,包括解释器和一套支持库。Python的代码必须在解释器中运行。程序运行程序员的视角一个Python程序仅是一个包含Python语句的文本文件。例:创建script0.py文件,并写上:print("Hello,world!")print(2**1......
  • 每天五分钟深度学习:广播机制(以python语言为例)
    本文重点因为向量化的计算方式导致效率的提升,所以现在很多时候,我们都是用向量化的计算,但是向量化计算有一个问题让人头痛就是维度的问题,本节课程我们将讲解python中的广播机制,你会发现这个机制的优秀之处。代码实例importnumpyasnpa=np.random.randn(3,4)b=np.random.r......
  • 2024年 Windows Python 下载、安装教程,附详细图文
    大家好,今天为大家带来的是2024年WindowsPython下载、安装教程,附详细图文,适用于Python3所有版本,包括Python3.7,Python3.8,Python3.103.9,Python3.10等版本。希望对大家有所帮助Python目前已支持所有主流操作系统,在Linux,Unix,Mac系统上自带Python环境,一般默认装的是Py......
  • 《C++中的移动构造函数与移动赋值运算符:高效编程的利器》
    一、引言在C++编程中,随着现代软件对性能要求的不断提高,高效地管理资源变得至关重要。C++11引入了移动语义,其中移动构造函数和移动赋值运算符成为了提高程序性能和资源管理效率的重要工具。本文将深入探讨C++中的移动构造函数和移动赋值运算符的作用,以及它们在实际编程中......
  • 【python】本地local_setting设置与上传仓库
    1.我们在开发过程中,有的配置数据不希望别人看到,例如:数据库信息2.如是我们可以在本地配置一个local_setting.py文件2.1:在setting中最后,导入local_settingtry:from.local_settingimport*exceptImportError:pass2.2:将自己的配置数据,写入到local_setting......
  • 【Python使用】嘿马头条项目从到完整开发教程第8篇:缓存,多级缓存【附代码文档】
    本教程的知识点为:简介1.内容2.目标产品效果ToutiaoWeb虚拟机使用说明数据库理解ORM作用思考:使用ORM的方式选择数据库SQLAlchemy操作1新增2查询all()数据库分布式ID1方案选择2头条使用雪花算法(代码toutiao-backend/common/utils/snowflake)数据库Red......
  • Python基础知识-8(PyQt GUI开发,输出乱码处理)
    (目录)介绍一个VSCode轻量级RestAPI客户端插件:ThunderClient一、关于shebang明确指定解释器#!/usr/bin/python3在shell中寻找第一个python解释器#!/usr/bin/envpython3二、Python类的私有方法/属性Python不支持私有方法/属性,但可以将类成员方法/属性名定义为......