day27 离考试又近了一天
面向对象的三大特性分别是: 继承、封装、多态 往后的实际应用主要是继承 其他两个主要是一些概念 没有具体的表现形式
继承的含义
现实生活中继承是用来描述人与人之间资源的从属关系
eg:儿子继承父亲 那么就可以拥有父亲的一切(别墅、豪车...)
面向对象中继承则是用来描述类与类之间数据的从属关系
eg:类A继承了类B 那么类A就可以使用类B中所有的数据(数据、功能..)
继承的目的
现实生活中通过继承可以快速的积累财富少奋斗N多年 并且可以多继承
eg:可以认多个爹 傍多个富婆 (举个例子 现实中不可取不可取)
面向对象中通过继承可以减少代码冗余 提升开发效率 同样也支持多继承
eg:类A可以继承多个类同时拥有多个类里面的代码使用权
class A(B):
pass
我们将被继承的类称为:父类或者基类 指代B
继承别人的类称为:子类或者派生类 指代A
在python中一个类可以同时继承多个父类
class A(B,C,D): # B\C\D都是父类 都可以继承
pass
抽象:由下往上抽取相同特征 eg:学生和教师推导出人类 由儿子推导到父亲再推导到爷爷 继承:由上往下直接白嫖资源 eg:学生和教师可以直接继承人类的功能和数据 """ 在面向对象编程中 其实类和父类的主要功能都是用来减少代码冗余的 对象:数据与功能的结合体 类:多个对象相同数据和功能的结合体 父类:多个类相同数据和功能的结合体 """
#############################################
'''名字的查找顺序永远都是 先从当前对象自身开始查找'''
#############################################
名字的查找顺序是
先从对象自己的名称空间中查找 没有则去类里面的名称空间查找
先找对象 >>> 再找类
'''注意设置值的情况下是在自身的名称空间中添加或者修改数据'''
名字的查找顺序是
先从对象自己的名称空间中查找 没有择取产生对象的类中查找
如果还没有并且类有父类则去父类中查找 以此往复下去!!!
查找顺序 对象 >>> 类 >>> 父类
经典案例 搞你脑子
在python2中存在经典类与新式类
在python3中只有新式类
区分的关键在于是否继承了一个默认的object类
新式类:直接或者间接继承了object或者其子类的类
经典类:不继承任何的类
# 在python 2 中 class A: pass print A.__bases__ # 空的 print(A.__bases__) # (<class 'object'>,)
为了兼容python2和python3
有时候我们在定义类的时候会习惯性的写
class MyClass(object):
pass
强度:研究菱形和非菱形问题object不参与图形构建 非菱形继承的情况下 父类中名字的查找顺序就是按照继承时从左往右依次查找 如果多个父类还有分类 那么遵循"深度优先" 一条道走到黑 ADBECF 菱形继承的情况下 父类中名字的查找顺序就是按照继承时从左往右依次查找 如果多个父类还有分类 那么遵循"广度优先" 再走深度 ADBECFM
如果自己写的子类需要使用父类的方法 并且还需要基于该方法做扩展
这样的子类我们称之为派生类(本质还是子类)
那么可以使用super关键字来实现