15. 繼承 - 多重繼承

Python的一個子類別可以繼承多個父類別,這個特性稱為多重繼承(multiple inheritance)。

(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
        
    def info(self):
        print(f'職員:{self.no}, {self.name}')

#----------------------
# 父類別, 自然人
#----------------------    
class NaturalPerson():
    def __init__(self, id, name):        
        self.__id = id
        self.__name = name
        
    @property
    def id(self):
        return self.__id 
    
    @property
    def name(self):
        return self.__name
    
    @id.setter
    def id(self, id):
        self.__id = id
        
    @name.setter
    def name(self, name):
        self.__name = name
        
    def info(self):
        print(f'自然人:{self.id}, {self.name}')        
        
#----------------------
# 子類別, 一般職員
#----------------------    
class RegularEmployee(Employee, NaturalPerson):
    def __init__(self, no, id, name, overtimes):
        Employee.__init__(self, no, name)
        NaturalPerson.__init__(self, id, name)
        self.__overtimes = overtimes
        
    @property
    def overtimes(self):
        return self.__overtimes    
    
    @overtimes.setter
    def overtimes(self, overtimes):
        self.__overtimes = overtimes
    
    #具體化計算薪水的方法
    def salary(self):
        return 50000 + self.overtimes*250

第58行用class RegularEmployee(Employee, NaturalPerson):宣告它有兩個父類別。 第60行呼叫Employee的建構元。 第61行呼叫NaturalPerson的建構元。

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

r = RegularEmployee('1001', 'A123456789', '王小明', 20)

print(r.no)
print(r.id)
print(r.name)
r.info()
print(r.salary())

第6行呼叫實體的info()方法,雖然兩個父類別都有info()方法,但原繼承的宣告寫成class RegularEmployee(Employee, NaturalPerson):,將會從繼承的由左至右的順序,先找Employee是否有info()方法,如果有就執行,如果沒有再找NaturalPerson的info()方法。

執行結果:

1001 A123456789 王小明 職員:1001, 王小明 55000

說明:

問題:

請以以上的例子為基礎,再增加1個「海外職員」類別,名稱是「OverseasEmployee」。「海外職員」也繼承「職員」和「自然人」,它有1個建構元以設定「no」及「name」(呼叫Employee的建構元),也設定「id」及「name」(呼叫NaturalPerson的建構元),自己再設定「派外國家」。它也要完成salary()方法,用來計算薪水。計算的方法是「派至美國薪水80,000元,其他國家75,000元」。

請產生「海外職員」實體,印出他的info()及薪水。 '1001', 'B123456789', '王小明', '美國'