加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Python __del__ 方式 销毁对象

发布时间:2022-07-06 19:31:20 所属栏目:编程 来源:互联网
导读:我们知道,Python 通过调用 __init__() 方法构造当前类的实例化对象,而本节要学的 __del__() 方法,功能正好和 __init__() 相反,其用来销毁实例化对象。 事实上在编写程序时,如果之前创建的类实例化对象后续不再使用,最好在适当位置手动将其销毁,释放
  我们知道,Python 通过调用 __init__() 方法构造当前类的实例化对象,而本节要学的 __del__() 方法,功能正好和 __init__() 相反,其用来销毁实例化对象。
 
  事实上在编写程序时,如果之前创建的类实例化对象后续不再使用,最好在适当位置手动将其销毁,释放其占用的内存空间(整个过程称为垃圾回收(简称GC))。
  大多数情况下,Python 开发者不需要手动进行垃圾回收,因为 Python 有自动的垃圾回收机制(下面会讲),能自动将不需要使用的实例对象进行销毁。
 
  无论是手动销毁,还是 Python 自动帮我们销毁,都会调用 __del__() 方法。举个例子:
  class CLanguage:
      def __init__(self):
          print("调用 __init__() 方法构造对象")
      def __del__(self):
          print("调用__del__() 销毁对象,释放其空间")
  clangs = CLanguage()
  del clangs
  程序运行结果为:
  调用 __init__() 方法构造对象
  调用__del__() 销毁对象,释放其空间
 
 
  但是,读者千万不要误认为,只要为该实例对象调用 __del__() 方法,该对象所占用的内存空间就会被释放。举个例子:
  class CLanguage:
      def __init__(self):
          print("调用 __init__() 方法构造对象")
      def __del__(self):
          print("调用__del__() 销毁对象,释放其空间")
  clangs = CLanguage()
  #添加一个引用clangs对象的实例对象
  cl = clangs
  del clangs
  print("***********")
  程序运行结果为:
  调用 __init__() 方法构造对象
  ***********
  调用__del__() 销毁对象,释放其空间
 
  注意,最后一行输出信息,是程序执行即将结束时调用 __del__() 方法输出的。
 
  可以看到,当执行 del cl 语句时,其应用的对象实例对象 C 的计数器继续 -1(变为 0),对于计数器为 0 的实例对象,Python 会自动将其视为垃圾进行回收。
 
  需要额外说明的是,如果我们重写子类的 __del__() 方法(父类为非 object 的类),则必须显式调用父类的 __del__() 方法,这样才能保证在回收子类对象时,其占用的资源(可能包含继承自父类的部分资源)能被彻底释放。为了说明这一点,这里举一个反例:
  class CLanguage:
      def __del__(self):
          print("调用父类 __del__() 方法")
  class cl(CLanguage):
      def __del__(self):
          print("调用子类 __del__() 方法")
  c = cl()
  del c
  程序运行结果为:
  调用子类 __del__() 方法

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!