一个类的例子 |
您所在的位置:网站首页 › 销售工资结算方式 › 一个类的例子 |
类的例子
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 |