Python子类存在同名不同参方法时如何调用父类对应方法?
原理说明
Python属于动态类型语言,方法重写不会强制要求和父类方法签名(参数、返回值类型)一致,只要子类定义了和父类同名的方法,就会直接覆盖父类的实现,MRO查找时会优先返回子类的方法,这就是你调用super_human.print_name("Kent")报错的原因:子类的print_name只接受self一个参数,你额外传了"Kent"自然不符合参数要求。
调用父类同名方法的实现方式
完全可以调用到被覆盖的父类同名方法,常用有两种场景的实现方式:
1. 在子类内部调用父类方法
用super()函数即可直接指代父类实例,调用对应方法即可,示例如下:
class Superhero(Person): def __init__(self, name, age, power): super().__init__(name, age) self.power = power def print_name(self, last_name=None): # 如果传了last_name就调用父类的打印逻辑 if last_name: super().print_name(last_name) # 否则走子类自己的逻辑 else: print(self.name)
修改后下面的调用都可以正常运行:
super_human.print_name() # 输出 Superman super_human.print_name("Kent") # 输出 Superman Kent
2. 在类外部直接调用父类被覆盖的方法
如果不想修改子类代码,又需要调用父类的同名方法,可以显式指定父类名调用,把实例作为self参数手动传入即可:
# 直接调用Person类的print_name方法,把super_human作为self传入 Person.print_name(super_human, "Kent")
运行后会直接输出Superman Kent,不会触发子类的方法逻辑。
内容的提问来源于stack exchange,提问作者brightstar2100
相关产品推荐
相关产品推荐

