方法继承和调用 Parent.method() 的意义何在?



我遇到了这个方法继承的例子:

Manager类继承自父Employee类,并修改其give_raise()方法,同时还在新实现中调用Employee.give_raise()

# Parent class
class Employee:
def __init__(self, name, salary=30000):
self.name = name
self.salary = salary
def give_raise(self, amount):
self.salary += amount
# Child class         
class Manager(Employee):
def display(self):
print("Manager ", self.name)
def __init__(self, name, salary=50000, project=None):
Employee.__init__(self, name, salary)
self.project = project
# Modify the give_raise method
def give_raise(self, amount, bonus=1.05):
new_amount = amount * bonus
# Call the parent method
Employee.give_raise(self, new_amount)


mngr = Manager("John Smith", 80000)
mngr.give_raise(5000)
print(mngr.salary)

我的问题是:这不是有点复杂吗?

我得到了类继承。但是在同名的子方法中调用父方法?

将Manager类中的give_raise()写为:不是更好吗

def give_raise(self, amount, bonus):
new_amount = amount * bonus
self.salary += amount

对我来说,只有当Parent.method()是一种需要大量代码的完全不同的方法时,调用它才有意义

我同意您最初的问题,因为实现有点复杂,无法清楚地传达预期用途。方法继承的主要目标是在类层次结构中鼓励可重用的封装行为。通过这种方式,派生类可以添加一些功能或覆盖底层功能(或者保持原样并添加其他功能(。

Parent.give_raise可以以一种不需要重写的方式进行定义,以便自定义提升不同员工类型的内容。

例如,

class Employee:
default_salary = 30000
def __init__(self, name, salary=None, bonus=1, **kwargs):
super().__init__(**kwargs)
if salary is None:
salary = self.default_salary
self.name = name
self.salary = salary
self.bonus_multiplier = bonus
def give_raise(self, amount):
self.salary += amount * self.bonus_multiplier

class Manager(Employee):
default_salary = 50000
def display(self):
print("Manager ", self.name)
def __init__(self, *, project=None, **kwargs):
if 'bonus' not in kwargs:
kwargs['bonus'] = 1.05
super.__init__(**kwargs)
self.project = project

mngr = Manager(name="John Smith", salary=80000)
mngr.give_raise(5000)
print(mngr.salary)

最新更新