""" 抽象类 / 方法重写 / 多态 实现一个工资结算系统 公司有三种类型的员工 - 部门经理固定月薪12000元/月 - 程序员按本月工作小时数每小时100元 - 销售员1500元/月的底薪加上本月销售额5%的提成 输入员工的信息 输出每位员工的月薪信息 Version: 0.1 Author: 骆昊 Date: 2018-03-12 """ from abc import ABCMeta, abstractmethod class Employee(object, metaclass=ABCMeta): def __init__(self, name): self._name = name @property def name(self): return self._name @abstractmethod def get_salary(self): pass class Manager(Employee): # 想一想: 如果不定义构造方法会怎么样 def __init__(self, name): # 想一想: 如果不调用父类构造器会怎么样 super().__init__(name) def get_salary(self): return 12000 class Programmer(Employee): def __init__(self, name): super().__init__(name) def set_working_hour(self, working_hour): self._working_hour = working_hour def get_salary(self): return 100 * self._working_hour class Salesman(Employee): def __init__(self, name): super().__init__(name) def set_sales(self, sales): self._sales = sales def get_salary(self): return 1500 + self._sales * 0.05 if __name__ == '__main__': emps = [Manager('武则天'), Programmer('狄仁杰'), Salesman('白元芳')] for emp in emps: if isinstance(emp, Programmer): working_hour = int(input('请输入%s本月工作时间: ' % emp.name)) emp.set_working_hour(working_hour) elif isinstance(emp, Salesman): sales = float(input('请输入%s本月销售额: ' % emp.name)) emp.set_sales(sales) print('%s本月月薪为: ¥%.2f元' % (emp.name, emp.get_salary()))