一个类的例子--员工工资


从学习中写的一个类学习类的知识

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即可。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值