python中的繼承與多態與C++中的相類似,可以通過抽象來實現多態與繼承,但是實現抽象並不是像C++一樣擁有內置功能,需要添加一個abc(Abstract Base Class)的模板來進行抽象操作。可以在定義一個類時在其中加入metaclass=ABCMeta來規定這是一個抽象類,以便於後面的操作。並且可以使用裝飾器@abstractmethod來進行抽象函數的定義,而且後續的繼承中必須重寫此函數。而且抽象類不可以實例化,只可以進行繼承。接下來就是我的代碼了(比較簡單,利用了抽象)
from abc import ABCMeta, abstractmethod
class Employee(object, metaclass=ABCMeta):
def __init__(self, name):
Employee._name = name
"""
:param name: 姓名
"""
self._name = name
@property
def name(self):
return self._name
@abstractmethod
def Salary(self):
pass
class Manager(Employee):
def Salary(self):
return 15000
class Programmer(Employee):
def __init__(self, name, working_hours=0):
super().__init__(name)
self._working_hours = working_hours
@property
def working_hours(self):
return self._working_hours
@working_hours.setter
def working_hours(self, working_hours):
self._working_hours = working_hours if working_hours > 0 else 0
def Salary(self):
return 150.0 * self._working_hours
class Salesman(Employee):
def __init__(self, name, sales=0):
super().__init__(name)
self._sales = sales
@property
def sales(self):
return self._sales
@sales.setter
def sales(self, sales):
self._sales = sales if sales > 0 else 0
def Salary(self):
return 1200.0 + self._sales * 0.05
def main():
People = [Manager("二狗"), Programmer("張三"), Salesman("李四"), Manager("王五"), Programmer("打工仔")]
for i in People:
if isinstance(i, Programmer):
i.working_hours = int(input('請輸入工作時間'))
elif isinstance(i, Salesman):
i.working_hours =int(input('請輸入銷售額'))
print("{}的本月公資爲{}".format(i.name, i.Salary()))
if __name__ == '__main__':
main()
代碼很簡單,爲了熟練抽象類的使用,若有不好的地方希望大家可以批評指正。