day21-1 类的继承
类的继承
什么是继承
- 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类可以称为基类或超类,新建的类称为派生类或子类
- 继承的特性是:子类会遗传父类的属性
- 继承是类与类之间的关系
为什么用继承
- 子类会"遗传"父类的属性,从而使用继承可以减少代码冗余
对象的继承
- python中支持继承一个或多个父类
class Parent1:
pass
class Parent2:
pass
class Son1(Parent1): # 单继承
pass
class Son2(Parent1, Parent2): # 多继承
pass
- 使用__bases__方法可以获取对象继承的类
print(Son2.__bases__)
print(Parent1.__bases__)
(<class '__main__.Parent1'>, <class '__main__.Parent2'>)
(<class 'object'>,)
新式类与经典类
- 只有在python2中才分新式类和经典类,python3中统一都是新式类
- 在python2中,声明继承object类的类,以及该类的子类,都是新式类;没有声明继承object类的类都是经典类
- 在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类
继承与抽象
继承描述的是子类与父类之间的关系,要找出这种关系,必须先抽象再继承,抽象即抽取类似或者说比较像的部分。
抽象分为两个层次:
1.将对象比较像的部分抽取成类
2.将类比较像的部分抽取成父类
继承:基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构
继承的应用
- 拿选课系统举例
class People:
def __init__(self, name, age, gender):
self.name = name
self.gender = gender
self.age = age
class Student(People):
def choose_course(self):
print(f'{self.name} 选课')
class Teacher(People):
def teach_course(self):
print(f'{self.name} 授课')
stud = Student('tank', 18, 'male')
tea = Teacher('nick', 40, 'male')
stud.choose_course()
tea.teach_course()
tank 选课
nick 授课
对象属性查找顺序
class People:
def __init__(self, name, age, gender):
self.name = name
self.gender = gender
self.age = age
def choose_course(self):
print('from People')
class Student(People):
def choose_course(self):
print('from Student')
stud = Student('tank', 18, 'male')
stud.choose_course()
from Student
class People:
def __init__(self, name, age, gender):
self.name = name
self.gender = gender
self.age = age
def choose_course(self):
print('from People')
class Student(People):
pass
stud = Student('tank', 18, 'male')
stud.choose_course()
from People
对象查找属性的顺序:对象自己--->对象的类--->父类--->父类。。。