我遇到了继承方法的结果输出不正确的问题。
任务:
创建一个存储实例属性名称的基类 Specialist,并具有方法 Drink_coffee(返回字符串“{name} 正在喝咖啡”)和 work(返回字符串“{name} 正在做工作”)。创建子类Coder,继承Specialist类的方法和属性,并重写work方法,使其返回类似“{name} writes code”的字符串。创建子类ProjectManager,继承Specialist类的方法和属性,并重写work方法,使其返回类似“{name}管理项目”的字符串。创建一个TeamLeader类,继承Coder和ProjectManager类的属性和方法,这样当调用work方法时,就返回字符串“{name}管理项目”。该标准将使用 MRO 工具进行测试
我的代码:
class Specialist:
def __init__(self, name):
self.name = name
# Метод drink_coffee
def drink_coffee(self):
return f"{self.name} пьет кофе"
# Базовый метод work
def work(self):
return f"{self.name} выполняет работу"
# Дочерний класс Coder, наследующий от Specialist
class Coder(Specialist):
# Переопределяем метод work
def work(self):
return f"{self.name} пишет код"
# Дочерний класс ProjectManager, наследующий от Specialist
class ProjectManager(Specialist):
# Переопределяем метод work
def work(self):
return f"{self.name} управляет проектом"
# Класс TeamLeader, наследующий от Coder и ProjectManager
class TeamLeader(Coder, ProjectManager):
# Переопределять метод work не нужно, он будет взят по MRO из ProjectManager
pass
需要进行的测试:
t = TeamLeader('瓦西里') print(t.work())
正确结论:
瓦西里管理该项目
我的错误结论:
瓦西里写的代码
如果我们打印MRO ->
print(TeamLeader.__mro__):出来什么?首先,我们在类中查找方法
TeamLeader,然后在 in 中查找Coder,然后在 in 中查找ProjectManager,最后在 in 中查找Specialist。在这种情况下,工作方法在类中找到Coder,因此结果是“Vasily writes code”。因此,为了得到“Vasily 管理项目”,需要改变继承顺序:
现在MRO将是:
这样,就会在类中找到工作
ProjectManager方法,结果将是“Vasily 管理项目”。作为学术兴趣。由于 TeamLeader 继承自 Coder 和 ProjectManager,因此它完成了两者的工作。