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 = 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__: 重载 [] 运算符,用于通过索引访问和设置向量的分量。

使用示例

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

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

相关推荐

  1. Python笔记 - 运算符重载

    2024-06-16 02:26:08       7 阅读
  2. C#学习笔记_运算符重载

    2024-06-16 02:26:08       27 阅读
  3. Python 运算符重载深入解析

    2024-06-16 02:26:08       18 阅读
  4. Python3 笔记:位运算符

    2024-06-16 02:26:08       13 阅读
  5. C++笔记打卡第11天(运算符重载、继承)

    2024-06-16 02:26:08       12 阅读
  6. C++学习笔记“类和对象”;运算符重载

    2024-06-16 02:26:08       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-16 02:26:08       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-16 02:26:08       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-16 02:26:08       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-16 02:26:08       20 阅读

热门阅读

  1. fastapi相关知识点回顾

    2024-06-16 02:26:08       8 阅读
  2. 力扣-1953

    2024-06-16 02:26:08       7 阅读
  3. 乐观锁和悲观锁

    2024-06-16 02:26:08       7 阅读
  4. Spring框架的原理及应用详解(四)

    2024-06-16 02:26:08       7 阅读
  5. 2024.6.15

    2024-06-16 02:26:08       9 阅读