生命周期方法
__new__方法
当我们创建一个对象是, 用于给这个对象分配内存的方法
通过拦截这个方法, 可以修改对象的创建过程
比如:单例设计模式
__init__方法
每个对象实例化的时候,都会自动执行这个方法
可以在这个方法里面,初始化一些实例属性
__del__方法
当对象被释放的时候调用这个方法
可用于在这个方法中清理资源
生命周期方法案例
personCount为全局变量,可以任意修改,不安全
Person.personCount和self.__class__.personCount两种写法都是可以的
在类外使用Person.personCount仍可以修改personCount的值,所以将personCount设置为私有属性
内存管理机制
存储方面
对于整数和短小的字符, Python会进行缓存; 不会创建多个相同对象
此时, 被多次赋值, 只会有多份引用
垃圾回收方面
引用计数器
一个对象, 会记录着自身被引用的个数
每增加一个引用, 这个对象的引用计数会自动+1
每减少一个引用, 这个对象的引用计数会自动-1
查看引用计数
import sys
sys.getrefcount(对象)
注意会大一
引用计数+1场景
对象被创建
p1 = Person()
对象被引用
p2 = p1
对象被作为参数,传入到一个函数中
log(p1)
这里注意会+2, 因为内部有两个属性引用着这个参数
对象作为一个元素,存储在容器中
l = [p1]
引用计数-1场景
对象的别名被显式销毁
del p1
对象的别名被赋予新的对象
p1 = 123
一个对象离开它的作用域
一个函数执行完毕时
内部的局部变量关联的对象, 它的引用计数就会-1
对象所在的容器被销毁,或从容器中删除对象
循环引用问题
垃圾回收时机
1. 自动回收
开启垃圾回收机制
gc.enable()
开启垃圾回收机制(默认开启)
gc.disable()
关闭垃圾回收机制
gc.isenabled()
判定是否开启
达到了垃圾回收的阈值
垃圾回收器中, 新增的对象个数和释放的对象个数之差到达某个阈值
涉及方法
gc.get_threshold()
获取自动回收阈值
gc.set_threshold()
设置自动回收阈值
2. 手动回收
触发条件
gc.collect()
执行一次垃圾回收(开关状态无效)