在 Python 中,许多运算符都可以进行重载,以下是一些常见运算符及其对应的魔法方法(特殊方法):
算术运算符
- 加法
+
:__add__
用于定义对象相加的行为。例如,当你对两个自定义类的实例使用+
运算符时,会调用__add__
方法。
class MyNumber:def __init__(self, value):self.value = valuedef __add__(self, other):return MyNumber(self.value + other.value)num1 = MyNumber(5)
num2 = MyNumber(3)
result = num1 + num2
print(result.value)
- 减法
-
:__sub__
你已经了解到它可以用于计算两个对象之间的差值。 - 在 Python 里,减法运算符
-
的重载并非 Python 库自带的功能,而是 Python 面向对象编程里的一种特性,名为运算符重载。下面详细给你解释这一概念。
运算符重载的概念
运算符重载允许你为自定义类重新定义运算符的行为。比如,在 Python 中,你可以为自定义类定义 __sub__
方法,这样在使用 -
运算符对该类的实例进行操作时,就会调用你定义的 __sub__
方法。
__sub__
方法示例
在你的 Cube
类里,__sub__
方法的定义如下:
def __sub__(self, other):return (self.x - other.x, self.y - other.y)
这里的 self
代表运算符 -
左边的 Cube
实例,other
代表运算符 -
右边的 Cube
实例。该方法返回一个元组,包含两个 Cube
实例在 x
和 y
方向上的坐标差值。
示例代码说明
以下是一个简单的示例,展示了如何使用 __sub__
方法:
import numpy as np# 假设 SIZE 已经定义
SIZE = 10class Cube:def __init__(self):self.x = np.random.randint(0, SIZE)self.y = np.random.randint(0, SIZE)def __str__(self):return f'{self.x}, {self.y}'def __sub__(self, other):return (self.x - other.x, self.y - other.y)def action(self, choise):if choise == 0:self.move(x=1, y=1)elif choise == 1:self.move(x=-1, y=1)elif choise == 2:self.move(x=1, y=-1)elif choise == 3:self.move(x=-1, y=-1)def move(self, x=False, y=False):if not x:self.x += np.random.randint(-1, 2)else:self.x += xif not y:self.y += np.random.randint(-1, 2)else:self.y += yif self.x < 0:self.x = 0elif self.x >= SIZE - 1:self.x = SIZE - 1if self.y < 0:self.y = 0elif self.y >= SIZE - 1:self.y = SIZE - 1# 创建两个 Cube 实例
cube1 = Cube()
cube2 = Cube()# 打印两个 Cube 实例的位置
print(f"Cube 1 的位置: {cube1}")
print(f"Cube 2 的位置: {cube2}")# 使用减法运算符计算两个 Cube 实例之间的相对位置
relative_position = cube1 - cube2
print(f"Cube 1 相对于 Cube 2 的位置: {relative_position}")
在这个示例中,我们创建了两个 Cube
实例 cube1
和 cube2
,接着使用 -
运算符计算它们之间的相对位置。由于我们在 Cube
类中定义了 __sub__
方法,所以 -
运算符会调用该方法并返回两个 Cube
实例在 x
和 y
方向上的坐标差值。
总结
__sub__
方法是 Python 运算符重载的一种应用,它允许你为自定义类重新定义减法运算符 -
的行为。通过定义 __sub__
方法,你可以方便地计算两个 Cube
实例之间的相对位置。
- 乘法
*
:__mul__
定义对象相乘的行为。
class MyNumber:def __init__(self, value):self.value = valuedef __mul__(self, other):return MyNumber(self.value * other.value)num1 = MyNumber(5)
num2 = MyNumber(3)
result = num1 * num2
print(result.value)
- 除法
/
:__truediv__
用于实现真除法。
class MyNumber:def __init__(self, value):self.value = valuedef __truediv__(self, other):return MyNumber(self.value / other.value)num1 = MyNumber(6)
num2 = MyNumber(3)
result = num1 / num2
print(result.value)
- 取模
%
:__mod__
定义取模运算的行为。 - 幂运算
**
:__pow__
实现幂运算。
比较运算符
- 等于
==
:__eq__
用于判断两个对象是否相等。
class MyNumber:def __init__(self, value):self.value = valuedef __eq__(self, other):return self.value == other.valuenum1 = MyNumber(5)
num2 = MyNumber(5)
print(num1 == num2)
- 不等于
!=
:__ne__
定义不等于的比较逻辑。 - 小于
<
:__lt__
用于判断一个对象是否小于另一个对象。 - 小于等于
<=
:__le__
实现小于等于的比较。 - 大于
>
:__gt__
定义大于的比较行为。 - 大于等于
>=
:__ge__
实现大于等于的比较。
赋值运算符
- 加法赋值
+=
:__iadd__
用于定义对象相加并赋值的行为。
class MyNumber:def __init__(self, value):self.value = valuedef __iadd__(self, other):self.value += other.valuereturn selfnum1 = MyNumber(5)
num2 = MyNumber(3)
num1 += num2
print(num1.value)
- 减法赋值
-=
:__isub__
- 乘法赋值
*=
:__imul__
- 除法赋值
/=
:__itruediv__
位运算符
- 按位与
&
:__and__
定义按位与的行为。 - 按位或
|
:__or__
实现按位或的运算。 - 按位异或
^
:__xor__
定义按位异或的逻辑。 - 按位取反
~
:__invert__
- 左移
<<
:__lshift__
- 右移
>>
:__rshift__
其他运算符
- 索引访问
[]
:__getitem__
和__setitem__
分别用于获取和设置对象的索引元素。
class MyList:def __init__(self):self.data = [1, 2, 3]def __getitem__(self, index):return self.data[index]def __setitem__(self, index, value):self.data[index] = valuemy_list = MyList()
print(my_list[0])
my_list[0] = 10
print(my_list[0])
- 调用对象
()
:__call__
允许将对象像函数一样调用。
class Adder:def __call__(self, a, b):return a + badder = Adder()
result = adder(3, 5)
print(result)
通过重载这些运算符,你可以让自定义类的对象像内置类型一样进行各种操作,增强代码的可读性和可维护性。