我遇到了這個方法繼承的例子:
子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)
我的問題是:這不是有點令人費解嗎?
我得到類繼承。但是在同名的子方法中呼叫父方法呢?
give_raise()在 Manager 類中寫成這樣不是更好嗎:
def give_raise(self, amount, bonus):
new_amount = amount * bonus
self.salary = amount
對我來說,只有Parent.method()當它是一個需要大量代碼行的完全不同的方法時才有意義
uj5u.com熱心網友回復:
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)
uj5u.com熱心網友回復:
我同意你最初的問題,因為實作有點復雜,無助于清楚地傳達預期用途。方法繼承的主要目標是鼓勵類層次結構中可重用的封裝行為。這樣派生類可以添加一些功能或覆寫底層功能(或保留它并添加其他功能)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/399041.html
上一篇:如果子類具有公共屬性,從抽象類繼承還是從介面繼承是更好的設計?
下一篇:可選陣列中缺少Swift資料
