首页 新闻 会员 周边 捐助

运算符重载为什么不叫运算符重写,重载是什么意思,感觉好拗口,__str__包含在内吗,这个感觉不像运算符

0
[已解决问题] 解决于 2025-08-14 10:12

运算符重载为什么不叫运算符重写,重载是什么意思,感觉好拗口,__str__包含在内吗,这个感觉不像运算符

_java_python的主页 _java_python | 小虾三级 | 园豆:1050
提问于:2025-08-14 09:57
< >
分享
最佳答案
0

"重载"(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

_java_python | 小虾三级 |园豆:1050 | 2025-08-14 10:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册