Python 类继承的实践

说到类大家就头疼,其实我更头疼!
为啥呢? 这个东西有个毛线用?
通常呢,一半讲类都是用 动物 猫 狗来说。 这次我打破常规 我用一个应用案例。

场景-一个公司要给不同的团队员工涨工资

关于涨工资这个事情我们分析一下 一些共同特征即: 工资的计算方式是一样的

例如:
每个人的基本工资*涨幅(20%,30%)这个是共同的对吧
那么每个团队,每个人的工资可能不一样。这个就是基于团队不同而不同。
所以我们可以拆解为:工资的计算公式为一个父类,他的功能可以被每个团队共享。
然而每个团队则有自己的工作内容也就是两个子类。
看代码吧!!!

但是我们还是从一个简单的开始说。。。。

#建立一个父类 
class person(object):
    def whoami(self):
           print('person is a human')

#建立chinese子类承父类功能方法
class Chinese(person):
     def where(self):
        print('chinese is from China')

#建立english子类承父类功能方法
class English(person):
     def where(self):
        print('english is from UK')


#输出

#执行:chinese = Chinese() #实例化子类
#执行chinese.where()  #调用子类方法并执行
#OUT-》》chinese is from China
#执行:chinese.whoami() #子类继承父类方法并执行
#OUT-》》person is a human
 
#执行:english=English()
#执行:english.where()
#OUT-》》english is from UK
#执行:english.whoami()
#OUT-》》person is a human

在看一个复杂的。。。。。。。

#建立一个父类 
class SalaryAddRate(object):
    def __init__(self,rate): #初始化属性(定义构造函数),是一个rate即工资的涨幅比例
        self.rate = rate   
    def add(self,base_salary): #类方法 即我们工资计算方式
        final_salary_aft_raise = base_salary*(1+self.rate)
        print ('OringalSalary:',base_salary,'AfterRaise:',final_salary_aft_raise)

#建立team1的子类并继承父类功能方法
class team1(SalaryAddRate): 
    def __init__(self,BaseSalary,rate):#初始化类属性和需要的参数,注意这里的参数多一个哦。 下边要用
        super().__init__(rate)   #使用super()初始化父类的属性
        self.salary = BaseSalary
        self.number = 0 #建立一个计数器,用于统计多少人涨了工资
    
    def add(self):
        super().add(self.salary) #使用super调用父类类方法
        self.number +=1 #更新子类属性

#建立team2的子类并继承父类功能方法
class team2(SalaryAddRate):
    def __init__(self,BaseSalary,rate):  
        super().__init__(rate)
        self.salary = BaseSalary
        self.number = 0
    
    def add(self):
        super().add(self.salary)
        self.number +=1

##----执行代码------#### 
TEAM1 = team1(BaseSalary=1000,rate=0.2) #实例化子类 
###这个时候会初始化子类属性,并初始化父类属性

TEAM1.add()
#调用子类方法, 子类方法会继承父类方法并执行返回结果
#OUT-》》OringalSalary: 1000 AfterRaise: 1200.0
TEAM1.number
#打印子类属性number 
#OUT-》》1

##再一次调用子类
TEAM1.add()
#打印子类属性number   #注意注意!!number 会更新
#OUT-》》2