一个类的例子

您所在的位置:网站首页 销售工资结算方式 一个类的例子

一个类的例子

2024-06-13 19:32| 来源: 网络整理| 查看: 265

类的例子 1.完整代码2.错误总结 从学习中写的一个类学习类的知识

1.完整代码 """ 问题: 某公司有三种类型的员工 分别是部门经理、程序员和销售员 需要设计一个工资结算系统 根据提供的员工信息来计算月薪 部门经理的月薪是每月固定15000元 程序员的月薪按本月工作时间计算 每小时150元 销售员的月薪是1200元的底薪加上销售额5%的提成 """ #abc库用来创建抽象类,即只可以继承,不能创建实例(三步:导库+step1+step2) from abc import ABCMeta,abstractmethod #固定月薪,时薪,底薪和提成 changeless_get = 15000 each_day_get = 150 base_get = 1200 get_proportion = 0.05 #父类,且是抽象类,只能用于继承 class Employee(metaclass=ABCMeta): #抽象类实现step1:metaclass=ABCMeta def __init__(self,name): self.__name = name #双下划线代表是私有变量 #@property装饰器的使用 #这边是获取私有变量,方法和属性名一样, #则可以通过name来获取私有变量的名字 @property def name(self): return self.__name #属性名.setter用来修改私有变量,也是property装饰器的方法 @name.setter def name(self,name): self.__name = name @abstractmethod #抽象类实现step2:@abstractmethod抽象类的方法 def get_money(self): pass class Manger(Employee): #继承父类(超类)Employee,Manger即为子类 def get_money(self): #重载(重写)方法,实现多态 print("经理%s本月薪资%.2f元"%(self.name,changeless_get)) class Program_man(Employee): #继承 def __init__(self,name,work_time=0): super().__init__(name) #初始化子类属性用super().__init__ self.__worktime = work_time #新增属性 @property def worktime(self): return self.__worktime @worktime.setter def worktime(self,worktime): self.__worktime = worktime def get_money(self): #重载 print("程序员%s该月的工资是%.2f元"%(self.name,each_day_get*self.__worktime)) class sale_man(Employee): def __init__(self,name,earn): super().__init__(name) self.__earn = earn @property def earn(self): return self.__earn @earn.setter def earn(self,earn): self.__earn = earn def get_money(self): print("销售员%s本月工资%.2f元"%(self.name,base_get+get_proportion*self.__earn)) def main(): manger_1 = Manger("张三") manger_1.get_money() program_man_1 = Program_man("雷军",150) program_man_1.get_money() sale_man_1 = sale_man("陈睿",82400) sale_man_1.get_money() if __name__ == '__main__': #写模块必写,表示只有运行该文件才运行如下方法 main()

结果:

经理张三本月薪资15000.00元 程序员雷军该月的工资是22500.00元 销售员陈睿本月工资5320.00元 2.错误总结

①:

class Program_man(Employee): def __init__(self,name,work_time=0): super.__init__(name) self.__worktime = work_time

子类继承父类并且初始化父类属性时的时候super.__init__(name)这里少了括号,导致TypeError: descriptor '__init__' requires a 'super' object but received a 'str'错误。修改为super().__init__(name)即可。

②:

class Program_man(Employee): def __init__(self,name,work_time=0): super().__init__(name) self.__worktime = work_time @property def name(self): return self.__name @name.setter def name(self,name): self.__name = name @property def worktime(self): return self.__worktime @worktime.setter def worktime(self,worktime): self.__worktime = worktime def get_money(self): print("程序员%s该月的工资是%.2f元"%(self.name,each_day_get*self.__worktime))

这里明明父类已经有property装饰器获取和修改name了,子类中已经成功继承了这些方法,不需要重新再写一次同样的方法。导致错误:AttributeError: 'Program_man' object has no attribute '_Program_man__name'

修改:将以下语句删除即可 @property def name(self): return self.__name @name.setter def name(self,name): self.__name = name

③:

def get_money(self): print("程序员%s该月的工资是%.2f元"%(self.__name,each_day_get*self.__worktime))

这边类中函数调用的是self.__name,也会出现如下错误:AttributeError: 'Program_man' object has no attribute '_Program_man__name' 更改为self.name即可。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3