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

代码很简单,为了熟练抽象类的使用,若有不好的地方希望大家可以批评指正。

猜你喜欢

转载自blog.csdn.net/u014146044/article/details/106220400