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', '王小明', '美國'