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 类来演示如何重载运算符。

python 复制代码
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 __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.y

    def __getitem__(self, index):
        if index == 0:
            return self.x
        elif index == 1:
            return self.y
        else:
            raise IndexError("Index out of range")

    def __setitem__(self, index, value):
        if index == 0:
            self.x = value
        elif index == 1:
            self.y = value
        else:
            raise IndexError("Index out of range")

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

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

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

使用示例

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

python 复制代码
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 类的示例演示了如何重载常用运算符。在实际开发中,合理使用运算符重载可以大大提高代码的可维护性和可读性。

相关推荐
Byron Loong6 分钟前
Python+OpenCV系列:【打卡系统-工具模块设计】工具模块深度揭秘,考勤智能化的核心秘籍!
python·opencv·webpack
漫无目的行走的月亮12 分钟前
基于Python Scrapy的豆瓣Top250电影爬虫程序
爬虫·python·scrapy
这里有鱼汤12 分钟前
数据分析从入门到放飞:Python三大金刚来助阵!
后端·python
算法哥1 小时前
解决Jupyter默认打开C盘的问题
ide·python·jupyter
小墨&晓末1 小时前
【PythonGui实战】自动摇号小程序
python·算法·小程序·系统安全
海棠AI实验室1 小时前
机器学习基础算法 (一)-线性回归
人工智能·python·机器学习
是我知白哒1 小时前
lxml提取某个外层标签里的所有文本
前端·爬虫·python
测试老哥1 小时前
Python自动化测试图片比对算法
自动化测试·软件测试·python·测试工具·程序人生·职场和发展·测试用例
爱数学的程序猿1 小时前
Python入门:1.Python介绍
开发语言·python
檀越剑指大厂3 小时前
【Python系列】Python中的`any`函数:检查“至少有一个”条件满足
开发语言·python