面向对象魔术方法-__del__()方法
1.python中对象赋值
# 对象赋值 # python中对象的赋值是地址的赋值 n = 5 n1 = n # 查看变量的内存地址 print(id(n)) print(id(n1))
将n指向5的地址给了n1
p = Person('Jack') p1 = p # 将p的地址给了p1 print(p) print(p1)
p和p1指向同一个空间
class Person: def __init__(self, name): self.name = name p = Person('Jack') p1 = p # 将p的地址给了p1 p2 = p print(p) print(p1) print(p2) print(p.name) print(p1.name) print(p2.name) print("====将属性值修改==========") p1.name = 'Tom' print(p1.name) print(p2.name) print(p.name)
2.del方法
只要你用del p2这样删除一个引用,就会默认调用__del__()方法
__del__:
(1)对象赋值
p = Person()
p1 = p # 对象赋值
说明:p和p1指向同一个地址
(2)删除地址的引用
del p1 # 删除了p1对这个地址的引用
(3)查看对地址的引用个数
import sys
sys.getrefcount(p) # 打印出关于地址的引用次数
(4)当一块空间没有任何引用了,就会默认执行__del__
ref = 0
class Person: def __init__(self, name): self.name = name def __del__(self): print('--del--') p = Person('Jack') p1 = p # 将p的地址给了p1 p2 = p print("====将属性值修改==========") p1.name = 'Tom' print(p1.name) print(p2.name) print(p.name) del p2 print("删除p2:", p.name) print(sys.getrefcount(p)) del p1 print("删除p1:", p.name) print(sys.getrefcount(p)) # del p # print(sys.getrefcount(p)) n = 5 print(5)
3.什么时机触发__del__()方法?
python解释器回收所有在这一次执行过程开辟的空间,只要没有引用了,一回收就会调用__del__()方法
4.什么时候触发垃圾回收机制?
只要在python解释器执行完毕了,而没有任何引用这块内存空间,这是垃圾回收就会把这个内存空间回收
python解释器在所有代码执行完成之后,会自动把所有引用断掉,触发垃圾回收机制,__del__()会被调用
垃圾回收 --- 内存释放