python是面向对象,扩展性强,那强再哪呢?
一、什么是继承
继承是一种新建类的方式,新建的类称之为子类,被继承的类称之为基类或父类
继承描述的是一种‘遗传’的关系:子类可以重用父类的属性。即 父类有的属性,子类也有,也可以重写属性,也可以有私有的属性
在Python中的继承注意两点:
1.Python中支持一个子类同时继承多个父类
2.Python中类分为两种:
新式类:但凡继承object的类以及该类的子类都是新式类
在python3中默认继承object类
经典类:没有继承object的类以及该类的子类都是经典类
在python2中才区分新式类和旧式类
二、为何要继承
1.减少代码冗余
2.
三、如何用继承
1.如何用继承减少代码冗余
继承解决的是类与类之间代码冗余问题,一定是一个类是另外一个类的子类
子类可以直接使用继承过来的函数
2.在继承的背景下属性查找的优先级
总结对象的相似之处就得到类,总结类的相似之处就得到父类
定义父类、子类,总结实际需求:
例子:
在写程序的时候:
单继承属性访问优先级:
对象 > 对象的类 > 父类
多继承属性访问优先级:
1.非菱形继承关系的优先级:
python2和python3一样
对象 > 子类 > 最左边父类的分支继承关系(包含分支的顶级父类) > 其次左边父类的分支继承关系(包含分支的顶级父类)... > 最右边父类的分支继承关系(包含分支的顶级父类)
例如:A(B,C,D) 优先级: A的对象 > A > B的继承关系 > C的继承关系 > D的继承关系
2.菱形继承关系的优先级:菱形继承关系就是子类继承多个父类而这些父类最终都有同一个最顶级父类。
a.python2:深度继承关系:
对象 > 子类 > 最左边父类的分支继承关系(包含父类的共同顶级父类) > 其次左边父类的分支继承关系(包含父类的共同顶级父类)... > 最右边父类的分支继承关系(包含父类的共同顶级父类)
例如:A(B,C,D), 而B,C,D有共同顶级父类E
优先级:A的对象 > A > B的继承关系 > E > C的继承关系 > D的继承关系
b.python3:广度继承关系:
对象 > 子类 > 最左边父类的分支继承关系(不包含父类的共同顶级父类) > 其次左边父类的分支继承关系(不包含父类的共同顶级父类)... > 最右边父类的分支继承关系(不包含父类的共同顶级父类)
例如:A(B,C,D), 而B,C,D有共同顶级父类E
优先级:A的对象 > A > B的继承关系 > C的继承关系 > D的继承关系 > E
3.完整版继承的demo
class JdSchool: school = '机电学院' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex self.score = 0 class JdStudent(JdSchool): def __init__(self): self.score = 0 def choose_course(self): print('%s 选课了' % self.name) class JdTeacher(JdSchool): def __init__(self, level): self.level = level def score(self, stu, num): stu.score = num
4.重用父类的功能1:在子类__init__函数调用父类的__init__。指明道姓的访问某一个类的函数
注意:1.该方式与继承没有关系的。
2.该方式使用了类的命名空间,存在一改全改的情况
3.访问某一个类的函数,没有自动传值的效果
class JdSchool: school = '机电学院' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class JdStudent(JdSchool): def __init__(self, name, age, sex): JdSchool.__init__(self,name, age, sex) self.score = 0 def choose_course(self): print('%s 选课了' % self.name) class JdTeacher(JdSchool): def __init__(self, name, age, sex, level): JdSchool.__init__(self,name, age, sex) self.level = level def score(self, stu, num): stu.score = num stu1 = JdStudent('zhangsan',18,'男') t1 = JdTeacher('lisi',18,'男',18)
5.重用父类的功能2:调用内置函数super。
super可以传参,在python2中,python2中需指定类名和对象名,super的参数填写(自己的类名,对象自己,参数....),在python3中,super的参数填写(参数...)
调用super()会得到一个返回值,返回的是一个特殊的对象,该对象是专门用来引用父类的属性
注意:
1.只能在子类当中使用,
2.这方式完全依赖于继承的m'ro列表
3.访问某一个类的绑定方法,有自动传值的效果
完整版demo
class JdSchool: school = '机电学院' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def test(self): print('test %s' % self.school) class JdStudent(JdSchool): def __init__(self, name, age, sex): super(JdStudent, self).__init__(name, age, sex) self.score = 0 def choose_course(self): print('%s 选课了' % self.name) class JdTeacher(JdSchool): def __init__(self, name, age, sex, level): super().__init__(name, age, sex) self.level = level def score(self, stu, num): stu.score = num