返回顶部
首页 > 资讯 > 后端开发 > Python >Python 中的对象析构函数__del__ 详情
  • 306
分享到

Python 中的对象析构函数__del__ 详情

2024-04-02 19:04:59 306人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录在python中何时使用__del__?析构函数使用紧要 前言: Python 中的类的构造函数 ​​__init__​​ , 每当实例产生就会调用这个构造函数。 反过来,每当实

前言:

Python 中的类的构造函数 ​​__init__​​ , 每当实例产生就会调用这个构造函数。

反过来,每当实例对象需要被垃圾收集被收回时,就需要用到析构函数 ​​__del__​​ 。

​​__del__​​ 方法是类的一种特殊方法。可以利用 ​​__del__​​ 方法来清理资源,例如关闭文件。

来看一个例子:

class Life:

    def __init__(self, name='None'):
        print('Hello,' + name)
        self.name = name

    def live(self):
        print(self.name)
    
    def __del__(self):
        print("Goodbye," + self.name)

def main():

    bob = Life('Bob')
    bob.live()

if __name__ == '__main__':
    main()

运行该代码,输出结果为:

Hello,Bob
Bob
Goodbye,Bob

我们得到上面的输出是因为当代码即将结束时,不再需要类 Life,因此它已准备好被销毁。 在类 Life 被销毁之前,会自动调用 ​​__del__​​ 方法。

还可以通过调用 ​​del​​ 手动调用 ​​__del__​​ 方法:

class Life:

    def __init__(self, name='None'):
        print('Hello,' + name)
        self.name = name

    def live(self):
        print(self.name)
    
    def __del__(self):
        print("Goodbye," + self.name)

def main():

    bob = Life('Bob')
    del bob

if __name__ == '__main__':
    main()

执行结果:

Hello,Bob
Goodbye,Bob

值得注意的是:​​del x​​ 并不直接调用 ​​x.__del__()​​ ,前者将 x 的引用计数减一,而后者仅在其引用计数达到零时才被调用。

在 Python 中,任何未使用的对象(如内置类型或类的实例)在不再使用时会自动从内存中删除(移除)。 这种释放和回收未使用内存空间的过程称为垃圾回收。

在Python中何时使用__del__?

重要的是要注意,当对象处于销毁的过程中,调用 ​​__del__​​ 方法(未损坏后),因此仍然可以在__del__方法中访问属性。

由于​​__del__​​ 可以访问对象的数据成员,因此应该确保对象的填充删除,以便没有内存泄露。

class App:
    def __init__(self):
        print("Open App")

    def __del__(self):
        print("Closed App")

class Phone:
    app = None

    def __init__(self):
        print("Switching on the Phone")
        self.__class__.app = App()

    def __del__(self):
        del self.__class__.app
        print("Switching off the Phone")

phone = Phone()

del phone

执行结果:

Switching on the Phone
Open App
Closed App
Switching off the Phone

在这个例子中,如果我们没有在​​__del__​​ 方法中销毁手机的属性 app,它就会留在内存中,导致内存泄漏。

析构函数使用紧要

Python 中的析构函数并不像 c++ 中那样被频繁使用,因为它存在一些众所周知的警告和极少数鲜为人知的暗坑。

尽量减少使用 ​​__del__​​ 函数:

  • 第一,因为 Python 在回收实例时,会自动回收该实例拥有的所有内存空间,所以析构函数并不需要考虑空间管理。所以也就失去了手动写 ​​__del__​​ 的意义。
  • 第二,无法预测一个实例什么时候会被回收。有时候你想触发析构函数时,系统表中对对象的引用会阻止析构函数的执行。Python 也无法保证解释器退出时,一个仍然存在的对象会调用其析构函数。
  • 第三,​​__del__​​ 可能会引发的异常会直接向 sys.stderr(标准错误流) 打印一条警告消息,而不是触发一个异常事件。因为它通过垃圾收集器运行在不可预料的上下文中。
  • 第四,当我们期待垃圾回收时,对象间的循环引用可能会阻止其发生。

总结:

  • 当对象被销毁时,Python 会自动调用对象上的 ​​__del__​​ 方法(​​类似于在对象创建期间调用的 ​​__init__​​ 构造函数)。
  • ​​__del__​​ 方法类似于 C++ 和 Java 中的析构函数。用于销毁对象的状态。
  • Python 中,尽量减少析构函数的使用。

到此这篇关于Python 中的对象析构函数__del__ 详情的文章就介绍到这了,更多相关Python 对象析构函数del内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python 中的对象析构函数__del__ 详情

本文链接: https://lsjlt.com/news/143431.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python 中的对象析构函数__del__ 详情
    目录在Python中何时使用__del__?析构函数使用紧要 前言: Python 中的类的构造函数 ​​__init__​​ , 每当实例产生就会调用这个构造函数。 反过来,每当实...
    99+
    2024-04-02
  • Python中的对象析构函数del怎么用
    这篇文章主要介绍“Python中的对象析构函数del怎么用”,在日常操作中,相信很多人在Python中的对象析构函数del怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中的对象析构函数del...
    99+
    2023-06-29
  • python 面向对象之析构函数
    析构函数: 在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作, 如关闭一些数据库连接,关闭打开的临时文件析构函数,是无法传参的class Role(object):     ...
    99+
    2023-01-30
    面向对象 函数 python
  • C++类与对象及构造函数析构函数基础详解
    目录C++类与对象类的定义对象的创建构造函数和析构函数访问修饰符继承多态成员变量与成员方法总结C++类与对象 C++是一门面向对象的编程语言。在C++中,我们可以利用类来创建对象,...
    99+
    2023-05-16
    C++类对象函数 c++ 构造析构函数
  • C++类与对象深入之构造函数与析构函数详解
    目录对象的初始化和清理一:构造函数1.1:构造函数的特性1.2:构造函数的分类二:析构函数2.1:概念2.2:特性三:拷贝构造函数3.1:概念3.2:特性3.3:拷贝构造函数调用时机...
    99+
    2024-04-02
  • Python面向对象中的封装详情
    目录一 封装的概念二 _ 和__ 对属性和方法的私有化1. 单下划线_2. 双下划线__3. 子类中访问父类的私有属性和私有方法三 访问及修改类的私有属性和私有方法1. 自定义公有方...
    99+
    2024-04-02
  • python中apply函数详情
    函数原型: DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwd...
    99+
    2024-04-02
  • Python构造函数与析构函数超详细分析
    目录1.构造函数2.析构函数1.构造函数 __init__(self), 这个方法就是构造函数,在实例化的时候自动调用。 所有如果这个函数内有打印的方法,当实例出来的时候会打印里面的...
    99+
    2022-11-13
    Python构造函数与析构函数 Python析构函数 Python构造函数
  • Java 中的类和对象详情
    目录1、类的定义2、类中变量的类型3、构造方法4、重载方法5、继承5.1 重写方法6、创建对象7、访问实例变量和方法8、比较对象8.1 使用 == 比较对象8.2 使用 equals...
    99+
    2024-04-02
  • 实例详解python类对象的析构释放
    本篇文章给大家带来了关于Python的相关知识,其中主要介绍了python类对象的析构释放代码演示,文章围绕主题展开详细的内容介绍,下面一起来看一下,希望对大家有帮助。前端(vue)入门到精通课程:进入学习【相关推荐:Python3视频教程...
    99+
    2024-04-02
  • C++对象的销毁之析构函数实例分析
    本文小编为大家详细介绍“C++对象的销毁之析构函数实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++对象的销毁之析构函数实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、对象的销毁生活中的对象...
    99+
    2023-06-30
  • C++面向对象中构造函数使用详解
    目录构造函数作用构造函数特征构造函数种类默认构造函数编译器合成的默认构造函数手动定义的默认构造函数自定义带参数的构造函数拷贝构造函数合成拷贝构造函数自定义拷贝构造函数拷贝构造函数的调...
    99+
    2022-11-13
    C++构造函数的作用 C++构造函数的写法
  • Python中print()函数的用法详情
    Python中print()函数的方法是打印指定的内容。在交互环境中输入“help(print)”指令,可以显示print()函数的使用方法, 如图1所示: ...
    99+
    2024-04-02
  • C++类、对象、构造函数及析构函数怎么定义使用
    这篇文章主要介绍“C++类、对象、构造函数及析构函数怎么定义使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++类、对象、构造函数及析构函数怎么定义使用”文章能帮助大家解决问题。C++类与对象C...
    99+
    2023-07-06
  • C++中类对象的拷贝构造函数
    本篇内容主要讲解“C++中类对象的拷贝构造函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中类对象的拷贝构造函数”吧!拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一...
    99+
    2023-06-17
  • 详析Python面向对象中的继承
    目录一单继承1.继承的基本语法格式如下2.查看类继承情况3.继承中的属性和方法4.初始化函数__init__()和super二多层继承三多重继承一 单继承 类继承作为python的三...
    99+
    2024-04-02
  • C++:函数对象,STL提供的函数对象,函数适配器详解
    目录1 函数对象2 STL提供的函数对象3 函数适配器总结1 函数对象 1.函数对象是行为类似函数的对象。一个类对象,表现出一个函数的特征,即通过对象名+(参数列表)的方式使用一个类...
    99+
    2024-04-02
  • Python 的可变和不可变对象详情
    目录Python 中的可变和不可变对象一、文字描述可变和不可变对象1、可变与不可变对象归类2、可变与可变对象的区别3、不可变对象的应用场景二、代码角度区别1、不可变对象-整型2、不可...
    99+
    2024-04-02
  • Python面向对象的程序设计详情
    1. 设计一个圆类,包括圆心位置、半径、颜色等属性。编写构造方法, 计算周长和面积。 import math class Circle:     def __init__(self,...
    99+
    2024-04-02
  • C++深入讲解对象的销毁之析构函数
    目录一、对象的销毁二、析构函数三、小结一、对象的销毁 生活中的对象都是被初始化后才上市的生活中的对象被销毁前会做一些清理工作—股而言,需要销毁的对象都应该做清理 解决方案...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作