这个小例子在编写中碰到一些问题:
1)父类的所有方法子类是可以不重写直接继承的。例中的__str__方法子类中都没有写,但是可以用。
2)此例在使用魔术方法调用get_salary方法时出现如下问题,①若return self.get_salary不加括号是返回这一地址,也就是说类中的方法等于一个属性,而这个属性拥有自己的地址,且是自定义类,不属于str类若不强转会报错。②使用方法时加括号,即return self.get_salary(),此时即可获得计算薪资这一方法所返回的值,但要注意也要str强转才能使用次魔术方法。
3)此例在父类People类中的get_salsary方法用到了has a 继承,即此类用到了别的类,属包含关系,此时要用形参类对象来接收创建出来的实例对象,最后底层利用实例对象获得最终结果。
'''
编写一个简单的工资管理程序,系统可以管理以下4类人:worker,salesman,manager,salemanager.
所有的员工都有员工号,姓名,工资等属性,有设置姓名,获取姓名,获取员工号,计算工资等方法
1)工人:工人具有工作小时数和时薪的属性,工资计算方法为工作小时数*时薪。
2)销售员:具有销售额和提成比例的属性,工资计算方法为销售额*提成比例
3)经理:具有固定月薪的属性,工资计算方法为固定月薪
4)销售经理:工资计算方法为销售额*提成比例+固定月薪
请根据以上要求设计合理的类,完成以下功能
1)添加所有类型的人员
2)计算月薪
3)显示所有人工资情况
'''
#People类
class People:
#有编号,名字,工资的共同属性
def __init__(self,no,name,salary):
self.__no=no
self.__name=name
self.salary=salary
#修改,获取名字的方法
@property
def name(self):
return self.__name
@name.setter
def name(self,name):
if len(name)>0 and len(name)<=20:
self.__name=name
else:
print('姓名设置错误')
#获取编号的方法
@property
def no(self):
return self.__no
#计算月薪的方法
def get_salary(self,worker,salesman,manager,salemanager):
return '工人'+str(worker)+'销售'+str(salesman)+'经理'+str(manager)+'销售经理'+str(salemanager)
#显示所有人的工资情况
def __str__(self):
#这个魔术方法在调用返回时一定要是字符型
#要想获得类中方法执行后的值,方法后得加()
return str(self.get_salary())
#工人类
class worker(People):
def __init__(self,no,name,salary,time,ts):
super().__init__(no,name,salary)
self.time=time
self.ts=ts
def get_salary(self):
self.salary=self.time*self.ts #工时*时薪
return self.salary
#销售类
class salesman(People):
def __init__(self,no,name,salary,saleroom,royalty):
super().__init__(no,name,salary)
self.saleroom=saleroom
self.royalty=royalty
def get_salary(self):
self.salary=self.saleroom*self.royalty #销售额*提成比例
return self.salary
#经理类
class manager(People):
def __init__(self,no,name,salary):
super().__init__(no,name,salary)
def get_salary(self):
return self.salary
#销售经理类
class salemanager(People):
def __init__(self,no,name,salary,saleroom,royalty):
super().__init__(no,name,salary)
self.saleroom=saleroom
self.royalty=royalty
def get_salary(self):
self.salary=self.saleroom*self.royalty+self.salary
return self.salary
w=worker(2,'小样',7000,8,1000)
s=salesman(3,'小谢',7000,4000,1.5)
m=manager(4,'小熊',8000)
sm=salemanager(5,'小胡',7000,5000,2)
print(w,s,m,sm) #8000 6000.0 8000 17000 #调用每个类的实例对象的魔术方法,获取薪资
p=People(1,'小严',7000).get_salary(w, s, m, sm) #has a 方法,将实例对象作为实参传入People类的计算薪资中的形参,直接获取所有人的薪资
print(p) #工人8000销售6000.0经理8000销售经理17000
#访问name属性,并修改
p=People(1,'小样',7000)
p.name='xiaoyi'
print(p.name)