首页 新闻 会员 周边

overload重载和override重写

0
[已关闭问题] 关闭于 2026-06-05 14:33

重载”对应的英文是 Overload。它的原始含义源自计算机科学,指同一个名称承载了不同的功能,是对原有功能的扩展。比如 + 既能加数字,也能拼字符串,现在还能加你的自定义对象。

 

重写 (Override):通常发生在继承关系中,指的是子类完全覆盖并替换掉父类的同名方法。

 

“运算符重载”,本质上就是告诉 Python:当用户对你的自定义类使用这些特定的符号时,不要报错或者使用默认行为,而是去执行你在类内部定义好的那个对应的魔术方法。

问题补充:

你在代码里敲下的那些用来连接变量、触发某种动作的特殊符号,就是运算符

Python 的运算符主要可以分为以下几大类:

在编程语言中,运算符(Operator)指的是用于对值执行特定操作、运算或交互的符号。
结合我们之前讨论的内容以及 Python 的特性,运算符主要可以分为以下几大类:

1. 算术与逻辑运算符

这是最直观的数学和逻辑符号,用于对对象进行计算或比较。
  • 加法/拼接:+ (对应魔术方法 __add__
  • 减法:- (对应魔术方法 __sub__
  • 乘法/重复:* (对应魔术方法 __mul__
  • 比较:==, <, > (对应魔术方法 __eq__, __lt__, __gt__ 等)

2. 容器与调用运算符

这类运算符让自定义的对象可以像列表、字典或函数一样工作。
  • 下标取值:[] (例如 obj[key],对应魔术方法 __getitem__
  • 函数调用:() (例如 obj(),对应魔术方法 __call__

3. 属性访问运算符

也就是你上一轮问到的内容,Python 同样将它们视为操作符来进行底层拦截。
  • 点号属性访问:. (例如 p.name,对应魔术方法 __getattribute__ / __getattr__
  • 属性赋值:= (结合点号如 p.name = "abc",对应魔术方法 __setattr__
  • 属性删除:del (结合点号如 del p.name,对应魔术方法 __delattr__
*Tesla*的主页 *Tesla* | 小虾三级 | 园豆:1758
提问于:2026-06-05 14:16
< >
分享
所有回答(1)
0

它之所以被叫做“魔术”,是因为它们具有“不显式调用却自动生效”的表象

1. 触发机制不同:谁在决定调用什么?

  • 重载看的是“符号”和“参数”:
    当你写下 a + b 时,Python 会看 ab 是什么类型。如果它们是数字,就执行加法;如果是字符串,就执行拼接;如果是你的自定义类,就去调用你重写的 __add__。决定权在于那个 + 号。
  • 重写看的是“对象的真实身份”:
    假设有个父类 Animal 有方法 make_sound(),子类 Dog 重写了它。当一只狗对象调用这个方法时,不管别人怎么称呼它,Python 都会去执行 Dog 里的逻辑。决定权在于这只动物到底是谁(运行时多态)。

2. 目的与效果不同:是在干嘛?

  • 重载是为了“复用同一个符号”:
    如果没有重载,你想让两个向量相加,代码只能写成 v1.add(v2);想让两个向量相减,写成 v1.sub(v2)。有了重载,你可以直接用直观的数学符号 v1 + v2。它让代码更符合人类的直觉。
  • 重写是为了“实现多态(Polymorphism)”:
    比如动物园管理员手里有一个列表,里面既有猫也有狗。他只需要循环遍历,挨个调用 animal.make_sound(),猫就会喵喵叫,狗就会汪汪叫。他不需要知道具体是哪只动物,这就是重写带来的强大威力。
从代码动作上看,它们都是在自己的类里重新写了一个同名函数。
但在计算机科学的语境里:
  • 重写(Override) 发生在继承链上(父子关系),目的是改变一个普通方法的默认行为。
  • 重载(Overload) 发生在操作符或内置函数上,目的是让特定的符号认识并处理你的自定义数据类型。

所以,当我们说“通过重写魔术方法实现了运算符重载”时,其实是在描述这样一个奇妙的过程:你在底层偷偷地“重写”了父类的钩子函数,从而在表面上成功地为某个运算符“重载”了新的技能!

所以,广义上的“运算符重载”,就是让你自己定义的类实例,能够响应各种 Python 语法符号(包括加减乘除、点号、方括号等),表现得就像 Python 原生内置的数据类型一样自然

*Tesla* | 园豆:1758 (小虾三级) | 2026-06-05 14:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册