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

相关推荐
liwulin050617 分钟前
【PYTHON】使用Selenium + ChromeDriver以及XPATH语法
开发语言·python·selenium
copyer_xyf19 分钟前
Agentic RAG 实战:PostgreSQL + LangGraph 一条链路
python·postgresql·agent
动力 continue26 分钟前
Python 元类与异常类:类的“制造工厂”与“报错定制师”
开发语言·python·制造
147API34 分钟前
Python批量生成蒸馏数据,并发、重试、幂等和断点续跑
开发语言·jvm·python
青 春 记 忆36 分钟前
零基础入门python04:用注册校验理解字典、集合和条件判断
开发语言·vscode·python·python3.11
kels889939 分钟前
实战排坑:黄金实时API开发,XAUUSD Tick报文异常处理实践
开发语言·python·websocket·网络协议·信息可视化
FBI HackerHarry浩1 小时前
Pandas 库中用于分类变量独热编码(One-Hot Encoding)的函数 pd.get_dummies() 函数
开发语言·人工智能·python·pandas
高洁011 小时前
工信部教考中心证书-人工智能系列本系列
人工智能·python·深度学习·算法
李可以量化1 小时前
Tornado 从入门到精通(二)下:协程调用方式与经典使用模式
python
雪碧透心凉_1 小时前
Python OpenCV图像处理入门
图像处理·python·opencv