gpt4 book ai didi

python - 如果我在当前类中有一个同名函数,我该如何调用父方法(如果可能)

转载 作者:行者123 更新时间:2023-12-02 18:31:37 26 4
gpt4 key购买 nike

我正在阅读方法覆盖和其他语言,似乎要完全覆盖,该方法必须具有相同的签名(参数、返回类型...等)

所以我试图检查它是否与 python 一起工作,我尝试了下一个代码

class Person():
def __init__(self, name, age):
self.name = name
self.age = age

def print_name(self, last_name):
print(self.name + " " + last_name)

class Superhero(Person):
def __init__(self, name, age, power):
super().__init__(name, age)
self.power = power

def print_name(self):
print(self.name)


human = Person("Ron", 23)
super_human = Superhero("Superman", 30, "Flying")

human.print_name("Wesley")
super_human.print_name("Kent")

我在 super_human.print_name("Kent") 部分收到一个错误,它需要一个参数,但我传递了两个参数,我知道 MRO 存在于我看的 python 中进入(对象>类>父类),所以我想知道是否有一种方法可以调用存在于父类而不是当前类中的 print_name() 函数,因为它们采用不同的方式参数。

最佳答案

如果您要覆盖基类方法,则参数应始终与您要覆盖的内容兼容。这是可以从 Liskov Substitution Principle 中获取的基本准则之一。

如果您希望函数在未提供参数的情况下与 super 方法不同,那么您可以这样做:

class Superhero(Person):
def __init__(self, name, age, power):
super().__init__(name, age)
self.power = power

def print_name(self, last_name=None):
if last_name is None:
print(self.name)
else:
super().print_name(last_name)

这保留了 super 方法定义的契约,现在允许 Superhero 类以不同方式处理值。如果你总是想丢掉姓氏,那么就这样做:

class Superhero(Person):
def __init__(self, name, age, power):
super().__init__(name, age)
self.power = power

def print_name(self, last_name=None):
print(self.name)

关于python - 如果我在当前类中有一个同名函数,我该如何调用父方法(如果可能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69336592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com