运算符重载为什么不叫运算符重写,重载是什么意思,感觉好拗口,__str__包含在内吗,这个感觉不像运算符
"重载"(Overload)的原始含义
源自计算机科学术语,指同一名称承载不同功能。在编译原理中,函数重载指同一函数名处理不同参数类型。
与"重写"(Override)的本质区别
重载:扩展原有功能(如 + 既能加数字也能拼接字符串)
重写:完全覆盖父类方法(面向对象中的方法覆盖)
历史传承
C++最早使用"operator overloading"术语,Python沿用了这一表述
str 只是 内置函数 str() 的钩子,属于“特殊方法”,不对应任何运算符符号
运算符重载专指 算术/比较/位运算/容器操作符(+ - * / == [] 等)
1. 数学运算符
class Vector:
def __add__(self, other): # 重载 +
return Vector(self.x + other.x, self.y + other.y)
v1 + v2 # 实际调用 v1.__add__(v2)
2. 比较运算符
class Book:
def __lt__(self, other): # 重载 <
return self.price < other.price
book1 < book2 # 调用 book1.__lt__(book2)
其他可重载符号
运算符 对应方法 示例
== __eq__ a == b
[] __getitem__ obj[key]
() __call__ obj()
[] 对应 __getitem__/__setitem__ → 下标运算符重载
() 对应 __call__ → 函数调用运算符重载
读取 getitem 定义 obj[key] 的取值行为 my_dict['name']
写入 setitem 定义 obj[key] = value 行为 my_list[0] = 100
删除 delitem 定义 del obj[key] 行为 del my_cache['key']
class MyList:
def __getitem__(self, index):
return self.data[index] # 自定义下标读取逻辑
def \_\_setitem\_\_(self, index, value):
self.data[index] = value # 自定义下标写入逻辑
obj = MyList()
obj[0] = 10 # 调用 setitem
print(obj[0]) # 调用 getitem
调用 __call__ 使实例可像函数一样被调用 obj() → 触发调用
class Adder:
def __call__(self, a, b):
return a + b
add = Adder()
result = add(3, 5) # 调用 __call__,输出 8