面向对象继承:is a 及has a 的综合练习

     这个小例子在编写中碰到一些问题:

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)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值