Python 抽象类

什么是抽象类

    与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()
posted @ 2020-06-18 14:04  极限之旅  阅读(434)  评论(0编辑  收藏  举报