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
相关产品推荐
相关产品推荐

