# 15. 繼承 - 多重繼承

Python的一個子類別可以繼承多個父類別，這個特性稱為多重繼承（multiple inheritance）。

## (1) 「一般職員」繼承了「職員」及「自然人」

```python
#----------------------
# 父類別, 職員
#----------------------
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的建構元。\\

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

```python
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

### 說明：

![](https://content.gitbook.com/content/cvSm3MdIMokwmnGMfAfG/blobs/AyULcHLbQEDB8McruNlr/image.png)

### 問題：

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

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