python實戰之多態與繼承(簡單工資管理系統)

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()

代碼很簡單,爲了熟練抽象類的使用,若有不好的地方希望大家可以批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章