Rose_IT 2019-08-03 12:21 采纳率: 0%
浏览 297

python中property修饰器存在的意义和作用,问题描述详见问题,请前辈们通过实例分析讲解!

1.问题描述:
学了property修饰器后,并不十分清楚property的作用和意义,在编写代码时,感觉好像可用可不用,请教大家通过实际案例分析一下property的作用,即使用property修饰的属性和不适用property修饰的属性应用区别???

2.贴上代码:
代码主题:
某公司有三种类型的员工 分别是部门经理、程序员和销售员
需要设计一个工资结算系统 根据提供的员工信息来计算月薪
部门经理的月薪是每月固定15000元
程序员的月薪按本月工作时间计算 每小时150元
销售员的月薪是1200元的底薪加上销售额5%的提成

注意:代码示例1是没有使用property修饰的代码
代码2是部分使用property修饰的代码
代码3是标准代码
请前辈分析:
代码示例1:

from abc import ABCMeta,abstractmethod

class Worker(object,metaclass=ABCMeta):
    #绑定员工的属性,姓名
    def __init__(self,name):
        self._name = name

    @property
    def name(self):
        return self._name

    #定义抽象方法salary用来多态方法
    @abstractmethod
    def salary(self):
        pass

class Department_manager(Worker):
    #默认继承Worker属性:姓名

    #定义方法salary用来计算department_manager的薪水
    def salary(self):
        print('%s 本月的薪水为: 15000 元'% self._name)

class Programmer(Worker):

    def salary(self):
        work_hours = int(input('请输入%s 本月有效工作时间: '% self._name))
        s = work_hours * 150
        print('%s 本月的薪水为: %d 元'% (self._name,s))

class Salesman(Worker):

    def salary(self):
        sale = float(input('请输入%s 本月实际销售额: '% self._name))
        s = 1200 + sale * 0.05
        print('%s 本月的薪水为:%d 元'% (self._name,s))

def main():
    workers = [
    Department_manager('张飞'),Department_manager('B'),
    Programmer('C'),Programmer('D'),
    Salesman('E'),Salesman('F')]

    for worker in workers:
        worker.salary()

if __name__ == '__main__':
    main()

代码示例2:

from abc import ABCMeta,abstractmethod

class Worker(object,metaclass=ABCMeta):
    #绑定员工的属性,姓名
    def __init__(self,name):
        self._name = name

    @property
    def name(self):
        return self._name

    #定义抽象方法salary用来多态方法
    @abstractmethod
    def salary(self):
        pass

class Department_manager(Worker):
    #默认继承Worker属性:姓名

    #定义方法salary用来计算department_manager的薪水
    def salary(self):
        print('%s 本月的薪水为: 15000 元'% self._name)

class Programmer(Worker):
    def __init__(self,name,work_hours=0):
        super().__init__(name)
        self._work_hour = work_hours

    @property
    def work_hours(self):
        return self._work_hours

    @work_hours.setter
    def work_hours(self,work_hours):
        self._work_hours = work_hours

    def salary(self):
        work_hours = int(input('请输入%s 本月有效工作时间: '% self._name))
        s = work_hours * 150
        print('%s 本月的薪水为: %d 元'% (self._name,s))

class Salesman(Worker):

    def salary(self):
        sale = float(input('请输入%s 本月实际销售额: '% self._name))
        s = 1200 + sale * 0.05
        print('%s 本月的薪水为:%d 元'% (self._name,s))

def main():
    workers = [
    Department_manager('张飞'),Department_manager('B'),
    Programmer('C'),Programmer('D'),
    Salesman('E'),Salesman('F')]

    for worker in workers:
        worker.salary()

if __name__ == '__main__':
    main()

代码示例3:

from abc import ABCMeta, abstractmethod


class Employee(object, metaclass=ABCMeta):
    """员工"""

    def __init__(self, name):
        """
        初始化方法

        :param name: 姓名
        """
        self._name = name

    @property
    def name(self):
        return self._name

    @abstractmethod
    def get_salary(self):
        """
        获得月薪

        :return: 月薪
        """
        pass


class Manager(Employee):
    """部门经理"""

    def get_salary(self):
        return 15000.0


class Programmer(Employee):
    """程序员"""

    def __init__(self, name, working_hour=0):
        super().__init__(name)
        self._working_hour = working_hour

    @property
    def working_hour(self):
        return self._working_hour

    @working_hour.setter
    def working_hour(self, working_hour):
        self._working_hour = working_hour if working_hour > 0 else 0

    def get_salary(self):
        return 150.0 * self._working_hour


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 get_salary(self):
        return 1200.0 + self._sales * 0.05


def main():
    emps = [
        Manager('刘备'), Programmer('诸葛亮'),
        Manager('曹操'), Salesman('荀彧'),
        Salesman('吕布'), Programmer('张辽'),
        Programmer('赵云')
    ]
    for emp in emps:
        if isinstance(emp, Programmer):
            emp.working_hour = int(input('请输入%s本月工作时间: ' % emp.name))
        elif isinstance(emp, Salesman):
            emp.sales = float(input('请输入%s本月销售额: ' % emp.name))
        # 同样是接收get_salary这个消息但是不同的员工表现出了不同的行为(多态)
        print('%s本月工资为: ¥%s元' %
              (emp.name, emp.get_salary()))


if __name__ == '__main__':
    main()
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 19:37
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率