简介
Python 通过运算符重载提供了一种强大的机制来定制算术运算。本教程探讨了开发者如何通过在类中实现特殊方法来为数学运算定义自定义行为,从而实现更直观、灵活的编程技术。
Python 通过运算符重载提供了一种强大的机制来定制算术运算。本教程探讨了开发者如何通过在类中实现特殊方法来为数学运算定义自定义行为,从而实现更直观、灵活的编程技术。
运算符重载是 Python 中的一项强大功能,它允许自定义类定义标准运算符在其实例上的行为方式。通过定义像 +
、-
、*
等运算符如何与用户定义的对象协同工作,这项技术使开发者能够创建更直观、更具表现力的代码。
在 Python 中,运算符重载是通过特殊方法名来实现的,这些方法也被称为 “魔法方法” 或 “双下划线方法”(双下划线方法)。这些方法定义了运算符如何与类实例进行交互。
运算符 | 魔法方法 | 描述 |
---|---|---|
+ |
__add__ |
加法 |
- |
__sub__ |
减法 |
* |
__mul__ |
乘法 |
/ |
__truediv__ |
除法 |
% |
__mod__ |
取模 |
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 __str__(self):
return f"Vector({self.x}, {self.y})"
## 演示
v1 = Vector(2, 3)
v2 = Vector(4, 5)
v3 = v1 + v2
print(v3) ## 输出:Vector(6, 8)
运算符重载有以下几个好处:
通过理解这些基础知识,开发者可以在 Python 中创建更具表现力和强大功能的自定义类。LabEx 建议通过实践这些概念来有效掌握运算符重载。
Python 提供了几个魔法方法,用于在自定义类中实现算术运算。这些方法允许对象与标准算术运算符无缝交互。
魔法方法 | 运算符 | 描述 | 示例 |
---|---|---|---|
__add__ |
+ |
加法 | a + b |
__sub__ |
- |
减法 | a - b |
__mul__ |
* |
乘法 | a * b |
__truediv__ |
/ |
除法 | a / b |
__floordiv__ |
// |
整除 | a // b |
__mod__ |
% |
取模 | a % b |
__pow__ |
** |
幂运算 | a ** b |
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
def __add__(self, other):
return ComplexNumber(
self.real + other.real,
self.imag + other.imag
)
def __sub__(self, other):
return ComplexNumber(
self.real - other.real,
self.imag - other.imag
)
def __mul__(self, other):
return ComplexNumber(
self.real * other.real - self.imag * other.imag,
self.real * other.imag + self.imag * other.real
)
def __str__(self):
return f"{self.real} + {self.imag}i"
## 演示
c1 = ComplexNumber(3, 2)
c2 = ComplexNumber(1, 4)
print(f"加法: {c1 + c2}")
print(f"减法: {c1 - c2}")
print(f"乘法: {c1 * c2}")
Python 还通过其他魔法方法支持反向算术运算:
魔法方法 | 描述 |
---|---|
__radd__ |
反向加法 |
__rsub__ |
反向减法 |
__rmul__ |
反向乘法 |
Python 还提供了就地算术方法:
魔法方法 | 运算符 | 描述 |
---|---|---|
__iadd__ |
+= |
就地加法 |
__isub__ |
-= |
就地减法 |
__imul__ |
*= |
就地乘法 |
LabEx 建议通过实践这些方法来开发具有高级算术功能的健壮且灵活的 Python 类。
class Money:
def __init__(self, amount, currency='USD'):
self.amount = amount
self.currency = currency
def __add__(self, other):
if self.currency!= other.currency:
raise ValueError("不同货币不能相加")
return Money(self.amount + other.amount, self.currency)
def __mul__(self, multiplier):
return Money(self.amount * multiplier, self.currency)
def __str__(self):
return f"{self.currency} {self.amount:.2f}"
## 使用示例
salary = Money(5000)
bonus = Money(1000)
total = salary + bonus
print(total) ## 输出: USD 6000.00
class Vector:
def __init__(self, *components):
self.components = components
def __add__(self, other):
if len(self.components)!= len(other.components):
raise ValueError("向量维度必须相同")
return Vector(*[a + b for a, b in zip(self.components, other.components)])
def __mul__(self, scalar):
return Vector(*[c * scalar for c in self.components])
def __str__(self):
return f"Vector{self.components}"
## 演示
v1 = Vector(1, 2, 3)
v2 = Vector(4, 5, 6)
print(v1 + v2) ## 输出: Vector(5, 7, 9)
print(v1 * 2) ## 输出: Vector(2, 4, 6)
class CustomNumber:
def __init__(self, value):
self.value = value
def __eq__(self, other):
return self.value == other.value
def __lt__(self, other):
return self.value < other.value
def __gt__(self, other):
return self.value > other.value
## 比较演示
n1 = CustomNumber(10)
n2 = CustomNumber(20)
print(n1 < n2) ## 输出: True
方法 | 运算符 | 描述 |
---|---|---|
__eq__ |
== |
相等比较 |
__lt__ |
< |
小于 |
__gt__ |
> |
大于 |
__le__ |
<= |
小于或等于 |
__ge__ |
>= |
大于或等于 |
LabEx 建议通过实践这些技术,利用运算符重载来开发更具表现力和直观性的 Python 类。
Python 中的运算符重载使开发者能够通过定义标准算术运算符如何与自定义类协同工作,来创建更具表现力和自然的代码。通过理解和实现诸如 __add__
、__sub__
等特殊方法,程序员可以显著提高其面向对象 Python 代码的灵活性和可读性。