6. 继承

54 阅读2分钟

继承的基本语法

继承的意义:为了防止写重复的方法和属性。

背景:员工都有name,id的属性;都有print_info的方法打印名字和id。员工具体有全职员工和兼职员工。

继承语法:class 子类(父类):

子类已经默认写了_ _init_ _函数,并且默认调用 super()._ _init_ _(),因此可以获取父类的所有属性。通过子类中传入父类,可以获取父类所有方法。

#父类:员工
class Employee():
    def __init__(self,name,id):
        self.name=name
        self.id=id
    def print_info(self):
        print("name:",self.name,"id:",self.id)

#子类:全职员工
class FullTimeEmployee(Employee):
    pass

#子类:兼职员工
class PartTimeEmployee(Employee):
    pass

f=FullTimeEmployee("张三",10001)
f.print_info()

p=PartTimeEmployee("李四",10002)
p.print_info()
输出:
name: 张三 id: 10001
name: 李四 id: 10002

重写

重写的原因:如果子类偶尔有些方法和属性需要重新定义。

全职员工:有月薪monthly_salary属性

兼职员工:有日薪daily_salary,工作天数work_days属性

全职员工和兼职员工都有计算月薪calculate_monthly_pay的方法,但具体过程不一样。

如果有属性和方法需要根据不同子类个性重新定义,我们就有必要使用重写。

重写_ _init_ _函数:去重新定义属性/添加属性。

重写其他方法:覆盖父类方法。

需要注意的是添加属性:子类重写_ _init_ _函数,就会覆盖父类的_ _init_ _函数。如果只想要添加属性,且保留父类属性,可以在重写过程中,用super()._ _init_ _()来保留父类属性。

#父类:员工
class Employee():
    def __init__(self,name,id):
        self.name=name
        self.id=id
    def print_info(self):
        print("name:",self.name,"id:",self.id)
    def calculate_monthly_pay(self):
        pass

#子类:全职员工
class FullTimeEmployee(Employee):
    def __init__(self,name,id,monthly_salary):
        super().__init__(name,id)
        self.monthly_salary=monthly_salary

    def calculate_monthly_pay(self):
        return self.monthly_salary

#子类:兼职员工
class PartTimeEmployee(Employee):
    def __init__(self,name,id,daily_salary,work_days):
        super().__init__(name, id)
        self.daily_salary=daily_salary
        self.work_days=work_days

    def calculate_monthly_pay(self):
        return self.daily_salary*self.work_days


p=PartTimeEmployee("张三",1001,20,250)
p.print_info()
print(p.calculate_monthly_pay())
输出:
name: 张三 id: 1001
5000

关于super()

super()用来调用父类(基类)的方法,_ _init_ _()是类的构造方法,super()._ _init_ _() 就是调用父类的_ _init_ _()方法,同样可以使用super()去调用父类的其他方法。

关于self

子类中使用self

如果一个方法仅出现在父类中,子类中self.方法,那么就只会调用父类的该方法。

如果一个方法出现在父类中,子类也重写了该方法,子类中self.方法,那么就优先调用子类的该方法。

如果一个方法仅出现在子类中,子类中self.方法,那么就只会调用子类的该方法。