继承的基本语法
继承的意义:为了防止写重复的方法和属性。
背景:员工都有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.方法
,那么就只会调用子类的该方法。