12 面向对象编程:运算符重载
大约 3 分钟
本篇是 Python 系列教程第 12 篇,更多内容敬请访问我的 Python 合集
在理解运算符重载之前我们已经知道了什么是方法重载,方法重载就是子类继承父类并且定义了一个和父类一样的方法。
知道了什么是重载,也知道了什么是运算符(加减乘除等),那么运算符重载也很好理解了,其实就是在类里面也定义一些特殊方法,使得调用这些方法能实现类对象的加减乘除。当然方法名不是随意取的,要和运算符对应上。
以下是一些常见的运算符及其对应的特殊方法:
- 加法 (
+
):__add__(self, other)
- 减法 (
-
):__sub__(self, other)
- 乘法 (
*
):__mul__(self, other)
- 除法 (
/
):__truediv__(self, other)
- 求模 (
%
):__mod__(self, other)
- 幂 (
**
):__pow__(self, other[, modulo])
- 比较 (
==
):__eq__(self, other)
- 小于 (
<
):__lt__(self, other)
- 大于 (
>
):__gt__(self, other)
- 反向运算符(例如
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__
被用来返回一个包含 x
和 y
坐标的字符串,这使得输出更具可读性。
虽然 __repr__
不是用来重载算术或比较运算符的,但它可以被认为是一种形式的“方法重载”,因为它允许你自定义对象如何被转换成字符串形式。如果你有任何关于 __repr__
或者其他特殊方法的具体问题,请随时提问!