Python不支持重载,那加号为何能通吃?

Overloaded Overloading

Python不支持重载,那加号为何能通吃?

同事Peter曾问我:既然Python不支持方法重载,为什么加号既能做加法又能做字符串拼接?这看似矛盾的现象背后,其实藏着Python对“重载”一词的双重定义。Python确实不允许像Java那样定义多个同名但参数不同的方法,一旦重复定义,后一个会直接覆盖前一个。但Python支持运算符重载,通过__add__等魔法方法,让+号在不同类型间灵活工作。如果你真的需要类似重载的功能,可以通过手动分发逻辑或使用functools模块中的@singledispatch装饰器来实现。理解这两者的区别,能帮你更优雅地设计Python类。

当我们讨论编程语言时,'重载'这个词其实指代两种不同的概念,而Python只支持其中一种,不支持另一种。
  1. reichstein

    所以 `+` 并不是被“重载”了,`+` 语法只是调用第一个操作数上的 `__add__` 方法的一个简写,第二个操作数的值作为参数传入。也就是说:`e1 + e2` 仅仅是 `e1.__add__(e2)` 的语法糖,仅此而已。

    这算不上“运算符重载”,就像两个不同的类都有 `length` 属性,也不能叫“长度重载”一样。

    从一开始就用“运算符重载”这个说法本身就是个错误。

  2. rf15

    这是对 Python 中这一领域的不错介绍(尽管很多语言都有这个特性,同样也有很多语言禁止它)。我对于它究竟是有用还是令人困惑,仍然持观望态度。如果没有(甚至即使有)好的变量名,`a + b` 简直就是个谜,尤其是当你处理那些来自你并不清楚内部细节的类的对象时。

  3. hnd9q09qk4

    这条评论历久弥新

同日更多故事

2026-07-26