10. 繼承 - 呼叫父親的建構元

一個類別可以繼承另一類別而使用被繼承者公開的變數及函式,被繼承者在此關係中稱為父類別(parent class)或基底類別(base class),繼承者稱為子類別(child class)或衍生類別(derived class)。如果在宣告類別時寫成class B(A): 表示A是父類別,B是子類別。呼叫父親的建構元時,寫成:

super().__init__(....)

(1) 「一般職員」和「鐘點職員」都繼承「職員」

#-------------------
# 父類別, 職員
#-------------------
class Employee():
    def __init__(self, no, name):
        self.__no = no
        self.__name = name
        
    @property
    def no(self):
        return self.__no
    
    @property
    def name(self):
        return self.__name        
  
    @no.setter
    def no(self, no):
        self.__no = no
        
    @name.setter
    def name(self, name):
        self.__name = name
        
#-------------------
# 子類別, 一般職員
#-------------------        
class RegularEmployee(Employee):
    def __init__(self, no, name, rank):
        super().__init__(no, name)
        self.__rank = rank
        
    @property
    def rank(self):
        return self.__rank
    
    @rank.setter
    def rank(self, rank):
        self.__rank = rank
        
    def salary(self, overtimes):
        if self.rank == 'A':
            return 50000 + overtimes*250
        else:
            return 45000 + overtimes*200

#-------------------
# 子類別, 鐘點職員
#-------------------        
class HourlyEmployee(Employee):
    def __init__(self, no, name):
        super().__init__(no, name)
            
    def salary(self, hours):
        return 245 * hours

第28及50行各宣告一個類別間的親子關係。 第30及52行以super().__init__(no, name)呼叫父親的建構元。

以下是一個使用它們的例子:

#產生1個一般職員
r = RegularEmployee('1001', '王小明', 'A')
print(r.no, r.name, r.rank)
print(r.salary(10))  #加班10小時

#產生1個鐘點職員
h = HourlyEmployee('1002', '陳小華')
print(h.no, h.name)
print(h.salary(30))  #工時30小時   

執行結果:

1001 王小明 A 52500 1002 陳小華 7350

說明:

問題:

請以以上的例子為基礎,再增加1個「海外職員」類別,名稱是「OverseasEmployee」。「海外職員」也繼承「職員」,它有2個自己的屬性,包括「職等(rank)」及「外派國家(country)」。海外職員另外也有一個計算薪水的方法(salary),計算方法是A職等的薪水都是100,000元;其他職等外派到美國有98,000元,其他國家是90,000元。

請產生以下海外職員實體並印出其個人資料及薪水: 1003, 李小文, A, 日本 1004, 張小蓉, B, 美國 1005, 周小娟, B, 日本