python面向对象之继承
继承
面向对象的三大特征:
1.封装
2.继承
3.多态
1、什么是继承?
继承就是一种新建类的方式,
新建的类我们称为子类或者叫派生类,
被继承的类成为父类或者叫基类
子类可以遗传父类的属性
2、为什么用继承?
类是解决对象与对象之间的代码冗余的
继承是解决类与类之间的代码冗余的
3、如何用继承
python支持多继承
经典类:没有继承object类的子子孙孙类都是经典类
新式类:继承了object以及该类的子子孙孙类都是新式类
python2中才区分新式类和经典类
python3 中都是新式类
4、继承的原理
mro列表
为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,
它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类
5、子类如何使用父类的属性
继承的方式有两种:
方式1:指名道姓, 跟继承没有关系
方式2:super() 严格依赖继承
指名道姓:再子类的__init__中直接调用父类的类名.函数名(传参),跟继承没有关系
class People():
school = 'SH'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
class Student(People):
# 递归
def __init__(self, name, age, gender, course=None):
if course is None:
self.courses = []
# self => stu1
People.__init__(self, name, age, gender)
def choose_course(self, course):
self.courses.append(course)
print("%s 选课成功 %s" % (self.name, self.courses))
class Teacher(People):
def __init__(self, name, age, gender, level):
People.__init__(self, name, age, gender)
self.level = level
def score(self, stu_obj, num):
stu_obj.num = num
print("%s老师给%s打了%s分" % (self.name, stu_obj.name, num))
stu1 = Student('tom', 19, 'male')
print(stu1.school)
print(stu1.name)
print(stu1.age)
tea1 = Teacher('lily', 28, 'female', 10)
print(tea1.school)
print(tea1.name)
print(tea1.age)
super():严格依赖继承。super().__init__(传参)
调用super()会得到一个特殊的对象,该对象会参照发起属性查找的那个类的mro
class People():
school = 'sh'
def __init__(self, name, age, course=None):
self.name = name
self.age = age
class Student(People):
def __init__(self, name, age, course):
# super(Student, self).__init__(name, age) # python2
super().__init__(name, age) # python3
self.course = course
class Teacher(People):
def __init__(self, name, age, level):
super().__init__(name, age) # python3
self.level = level
obj = Student('egon',19, 'python')
print(obj.name)
print(obj.age)

浙公网安备 33010602011771号