面向对象魔术方法-__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__()会被调用
垃圾回收 --- 内存释放

浙公网安备 33010602011771号