You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python为何允许类中定义同名方法?如何确定调用哪个方法?

Python中类的同名方法定义与调用逻辑

Python本身不支持方法重载,但允许在类中定义多个同名方法——本质上这不是重载,而是后定义的方法直接覆盖先定义的同名方法。

第一个代码示例解析

这段代码能正常运行:

class DoubleTest:
    def __init__(self):
        self._generate_thing()
    
    def _generate_thing(self, entry):
        print(entry)

    def _generate_thing(self):
        print("do the thing")

当类定义完成后,_generate_thing这个方法名最终指向的是最后定义的无参数版本。__init__里调用self._generate_thing()时,匹配的正是这个无参数方法,所以能正常执行。

第二个代码示例解析

这段代码运行会抛出TypeError:

class DoubleTest:
    def __init__(self):
        self._generate_thing("test")
    
    def _generate_thing(self, entry):
        print(entry)

    def _generate_thing(self):
        print("do the thing")

原因同样是类最终只保留了最后定义的无参数_generate_thing方法,调用时传入了"test"参数,和方法的参数要求不匹配,因此触发参数数量错误。

关键逻辑总结

  • 为什么允许定义同名方法?
    Python在类定义过程中,方法是作为类的属性存在的,就像字典的键值对——如果出现同名的键(方法名),后赋值的会直接覆盖之前的。Python不会做重载的语法检查,只是简单执行覆盖逻辑。

  • 调用时如何选择方法?
    类中最终只会存在最后一个定义的同名方法,调用时无论之前定义过多少个同名方法,只会调用这个最终保留的版本,参数是否匹配完全取决于这个方法的签名。

调用dir(test)看到只有一个_generate_thing方法,也印证了这一点——前面定义的同名方法已经被覆盖,不会保留在类的属性中。

内容的提问来源于stack exchange,提问作者Daniel Diggs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:12:40