什么是抽象类
与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
为什么要有抽象类
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
比如我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,要么是吃一个具体的香蕉,要么是吃一个具体的桃子。。。。。。你永远无法吃到一个叫做水果的东西。
从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的
在python中实现抽象类
""" 某公司有三种类型的员工 分别是部门经理、程序员和销售员 需要设计一个工资结算系统 根据提供的员工信息来计算月薪 部门经理的月薪是每月固定15000元 程序员的月薪按本月工作时间计算 每小时150元 销售员的月薪是1200元的底薪加上销售额5%的提成 """ 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 manger(employee): def get_salary(self): return 15000.0 class programer(employee): def __init__(self,name,work_hour=0): super().__init__(name) self._work_hour=work_hour def get_salary(self): return 150.0*self._work_hour @property def work_hour(self): return self._work_hour @work_hour.setter def work_hour(self,work_hour): self._work_hour=work_hour if work_hour>0 else 0 class salesman(employee): def __init__(self,name,sales=0): super().__init__(name) self._sales=sales def get_salary(self): return 1200.0+self._sales*0.05 @property def sales(self): return self._sales @sales.setter def sales(self,sales): self._sales=sales if sales >0 else 0 def main(): emps=[manger('wbb'),programer('bb'),salesman('lj')] for emp in emps: if isinstance(emp,programer): emp.work_hour=int(input("请输入%s本月工作时长:"%emp.name)) elif isinstance(emp,salesman): emp.sales=float(input("请输入%s本月的销售量:"%emp.name)) print("%s本月的工资为:¥%s元"%(emp.name,emp.get_salary())) if __name__=='__main__': main()