Python基础 -6-面向对象-02
一、生命周期
1、概念:指的是一个对象,从诞生到消亡的过程,当一个对象被创建时,会在内存中分配相应的内存空间进行储存,当这个对象不再使用时,为了节约内存,就会把这个对象释放。
2、监听对象生命周期 _ _new_ _方法:当我们创建一个对象时,用于给这个对象分配内存的方法,?通过拦截这个方法,可以修改对象的创建过程 _ _init_ _方法:当我们创建一个对象后,自动执行的方法(初始化方法) _ _del_ _方法:当我们删除一个对象后,自动执行的方法
3、储存方面 (1)在Python中万物皆对象, 不存在基本数据类型, 0,1.2,True,"abc"等都是对象 (2)所有对象,都会在内存中开辟一块空间进行储存,会根据不同的数据类型以及内容,开辟不同的空间大小进行储存,返回该空间的地址给外界接收(称为“引用”),用于后续对这个的操作 (3)可通过id()函数获取内存地址(10进制) (4)可通过hex()函数查看对应的16进制地址;例:hex(id(xxx)) (5)对于整数和短小的字符,Python会进行缓存;不会创建多个相同的对象 (6)容器对象储存的其他对象,仅仅是其他对象的引用,并不是其他对象本身
4、垃圾回收方面
(1)引用计数器 一个对象,会记录着自身被引用的个数(引用个数为0时被自动释放) 每增加一个引用,这个对象的引用计数会自动+1 每减少一个引用,这个对象的引用计数会自动-1
? ? ? ? 查看引用计数(注意会大1)
import ?sys sys.getrefcount(对象)
(2)垃圾回收
主要作用:从经历过“引用计数器”仍未被释放的对象中,找到“循环引用”,清理相关对象(即解决循环引用问题) ????????循环引用图解
二、面向对象三大特征
1、封装 ????????概念:
?将一些属性和方法封装在一个对象中,对外隐藏内部具体实现细节,内部实现,外界不需要关心,外界只需要根据“内部提供的接口”去使用就可以 ????????好处:
(1)使用起来更加方便,因为已经把很多相关功能封装成一个整体,类似于外界提供的一个工具箱,针对不同的场景,使用不同的工具箱就可以
(2)保证数据安全,?针对安全级别比较高的数据,可以设置成“私有”,可以控制数据为只读,外界无法修改,也可以拦截数据的写操作,进行数据校验和过滤
(3)利于代码维护,如果后期,功能代码需要维护,则直接修改这个类内部代码即可;只要保证接口名称不变,外界不需要做任何代码修改。
2、继承
概念:?现实中的“继承”,子女继承父母的“财产资源”;编程中的“继承”,一个类“拥有”另一个类的指“非私有的”属性和方法 目的:方便资源重用
分类:
(1)概念:?仅仅继承了一个父类
(2)概念:继承了多个父类
资源的继承: 在Python中继承指资源的使用权,所以,测试某个资源能否被继承,其实就是测试在子类中,能不能访问到父类中这个资源 结论:除了私有属性和私有方法,其他的基本都能继承 公有属性/方法 受保护属性/方法 内置方法
继承的几种形态: 单继承链 无重叠的多继承链 有重叠的多继承链
?
几种形态应该遵循的标准原则
?资源的覆盖: 包括:属性的覆盖,方法重写 原理:在MRO资源检索链中,优先级高的类写入了一个和优先级较低类同名的一个资源(属性或方法),去使用相关资源时,优先选择优先级较高的资源;从而造成“覆盖的假象” 注意事项:当调用优先级较高的资源时,注意self变化,谁调用方法:self就是谁, cls参数就是谁对应的类
资源的累加:对于重写__init__()方法增属性时,调用父类的__init__()方法。 super(),根据上下文环境自动判断,ython3+ 查看某个类资源查找顺序: 法1: import ?inspect inspect.getmro(类) 法2: ?? ?类名._ _mro_ _ 法3: ?? ?类名.mro()
3、多肽 概念:一个类,所延伸的多种形态,调用时的多种形态,(其它语言)在继承的前提下;使用不同的子类,调用父类的同一个方法,产生不同的功能
|