面向对象魔术方法-__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__()会被调用

垃圾回收 --- 内存释放

原文地址:https://www.cnblogs.com/GumpYan/p/12369633.html