1. """
    2. 某公司有三种类型的员工 分别是部门经理、程序员和销售员
    3. 需要设计一个工资结算系统 根据提供的员工信息来计算月薪
    4. 部门经理的月薪是每月固定15000元
    5. 程序员的月薪按本月工作时间计算 每小时150元
    6. 销售员的月薪是1200元的底薪加上销售额5%的提成
    7. """
    8. from abc import ABCMeta, abstractmethod
    9. class Employee(object, metaclass=ABCMeta):
    10. """员工"""
    11. def __init__(self, name):
    12. """
    13. 初始化方法
    14. :param name: 姓名
    15. """
    16. self._name = name
    17. @property
    18. def name(self):
    19. return self._name
    20. @abstractmethod
    21. def get_salary(self):
    22. """
    23. 获得月薪
    24. :return: 月薪
    25. """
    26. pass
    27. class Manager(Employee):
    28. """部门经理"""
    29. def get_salary(self):
    30. return 15000.0
    31. class Programmer(Employee):
    32. """程序员"""
    33. def __init__(self, name, working_hour=0):
    34. super().__init__(name)
    35. self._working_hour = working_hour
    36. @property
    37. def working_hour(self):
    38. return self._working_hour
    39. @working_hour.setter
    40. def working_hour(self, working_hour):
    41. self._working_hour = working_hour if working_hour > 0 else 0
    42. def get_salary(self):
    43. return 150.0 * self._working_hour
    44. class Salesman(Employee):
    45. """销售员"""
    46. def __init__(self, name, sales=0):
    47. super().__init__(name)
    48. self._sales = sales
    49. @property
    50. def sales(self):
    51. return self._sales
    52. @sales.setter
    53. def sales(self, sales):
    54. self._sales = sales if sales > 0 else 0
    55. def get_salary(self):
    56. return 1200.0 + self._sales * 0.05
    57. def main():
    58. emps = [
    59. Manager('刘备'), Programmer('诸葛亮'),
    60. Manager('曹操'), Salesman('荀彧'),
    61. Salesman('吕布'), Programmer('张辽'),
    62. Programmer('赵云')
    63. ]
    64. for emp in emps:
    65. if isinstance(emp, Programmer):
    66. emp.working_hour = int(input('请输入%s本月工作时间: ' % emp.name))
    67. elif isinstance(emp, Salesman):
    68. emp.sales = float(input('请输入%s本月销售额: ' % emp.name))
    69. # 同样是接收get_salary这个消息但是不同的员工表现出了不同的行为(多态)
    70. print('%s本月工资为: ¥%s元' %
    71. (emp.name, emp.get_salary()))
    72. if __name__ == '__main__':
    73. main()