重载”对应的英文是 Overload。它的原始含义源自计算机科学,指同一个名称承载了不同的功能,是对原有功能的扩展。比如 + 既能加数字,也能拼字符串,现在还能加你的自定义对象。
重写 (Override):通常发生在继承关系中,指的是子类完全覆盖并替换掉父类的同名方法。
“运算符重载”,本质上就是告诉 Python:当用户对你的自定义类使用这些特定的符号时,不要报错或者使用默认行为,而是去执行你在类内部定义好的那个对应的魔术方法。
你在代码里敲下的那些用来连接变量、触发某种动作的特殊符号,就是运算符
Python 的运算符主要可以分为以下几大类:
1. 算术与逻辑运算符
+ (对应魔术方法 __add__)- (对应魔术方法 __sub__)* (对应魔术方法 __mul__)==, <, > (对应魔术方法 __eq__, __lt__, __gt__ 等)2. 容器与调用运算符
[] (例如 obj[key],对应魔术方法 __getitem__)() (例如 obj(),对应魔术方法 __call__)3. 属性访问运算符
. (例如 p.name,对应魔术方法 __getattribute__ / __getattr__)= (结合点号如 p.name = "abc",对应魔术方法 __setattr__)del (结合点号如 del p.name,对应魔术方法 __delattr__)它之所以被叫做“魔术”,是因为它们具有“不显式调用却自动生效”的表象
1. 触发机制不同:谁在决定调用什么?
a + b 时,Python 会看 a 和 b 是什么类型。如果它们是数字,就执行加法;如果是字符串,就执行拼接;如果是你的自定义类,就去调用你重写的 __add__。决定权在于那个 + 号。Animal 有方法 make_sound(),子类 Dog 重写了它。当一只狗对象调用这个方法时,不管别人怎么称呼它,Python 都会去执行 Dog 里的逻辑。决定权在于这只动物到底是谁(运行时多态)。2. 目的与效果不同:是在干嘛?
v1.add(v2);想让两个向量相减,写成 v1.sub(v2)。有了重载,你可以直接用直观的数学符号 v1 + v2。它让代码更符合人类的直觉。animal.make_sound(),猫就会喵喵叫,狗就会汪汪叫。他不需要知道具体是哪只动物,这就是重写带来的强大威力。所以,当我们说“通过重写魔术方法实现了运算符重载”时,其实是在描述这样一个奇妙的过程:你在底层偷偷地“重写”了父类的钩子函数,从而在表面上成功地为某个运算符“重载”了新的技能!
所以,广义上的“运算符重载”,就是让你自己定义的类实例,能够响应各种 Python 语法符号(包括加减乘除、点号、方括号等),表现得就像 Python 原生内置的数据类型一样自然