python 类对象的析构释放代码演示
文章目录
- 一、类的构造函数与析构函数
- 二、代码演示
- 1. 引用的更迭
- 2. 只在函数内部的类对象
- 三、函数内部返回的类对象
- 1. 使用全局变量 引用 函数内部的类对象
一、类的构造函数与析构函数
- init 函数是python 类的构造函数,在创建一个类对象的时候,就会自动调用该函数;可以用来在创建对象的时候,设置该对象的一些初始化信息和设置。
- del 函数是python 类的析构函数,在一个类对象生命周期结束、被销毁的时候,就会自动调用该函数;主要用来释放对象占用的一些资源等。
二、代码演示
1. 引用的更迭
如下,编写了一个 demo 类的实现代码。
>>> class demo():
... def __init__(self):
... print("init class")
... print(self)
... def __del__(self):
... print("del class")
... print(self)
...
>>>
该类对象在创建的时候,会调用 __init__函数,打印出 “init class”;
该类对象在销毁的时候,会调用 __del__函数,打印出 “del class”。
>>> a1 = demo()
init class
<__main__.demo instance at 0x7f328f7c6cb0>
>>>
>>> a2 = demo()
init class
<__main__.demo instance at 0x7f328f7c6d40>
>>>
>>>
>>>
>>> a1 = demo()
init class
<__main__.demo instance at 0x7f328f7c6d88>
del class
<__main__.demo instance at 0x7f328f7c6cb0>
>>>
首先使用变量 a1 引用一个 demo 类对象,此时打印出"init class",以及a1 变量所引用的对象地址 0x7f328f7c6cb0;
使用变量 a2 引用另外的一个 demo 类对象,此时打印出"init class",以及a2 变量所引用的对象地址 0x7f328f7c6d40;
a1 和 a2 变量所引用的类对象是不同的两个对象 0x7f328f7c6cb0 和 0x7f328f7c6d40。
最后创建一个 demo 类对象,再次使用 a1 变量来指向,此时 a1 引用了新的类对象,引用地址为 0x7f328f7c6d88;同时,由于之前 a1 引用的对象0x7f328f7c6cb0 不再有人引用它,因此旧的 demo 类对象的空间被释放,打印出了 “del class 0x7f328f7c6cb0”。
2. 只在函数内部的类对象
>>> def create_demo():
... inst = demo()
...
>>> create_demo()
init class
<__main__.demo instance at 0x7f328f7c6cb0>
del class
<__main__.demo instance at 0x7f328f7c6cb0>
>>>
>>>
>>>
>>> create_demo()
init class
<__main__.demo instance at 0x7f328f7c6cb0>
del class
<__main__.demo instance at 0x7f328f7c6cb0>
>>>
>>>
>>>
>>> create_demo()
init class
<__main__.demo instance at 0x7f328f7c6cb0>
del class
<__main__.demo instance at 0x7f328f7c6cb0>
>>>
定义一个函数 create_demo,该函数的作用是创建一个 demo 类对象,并且使用 inst 变量来引用创建的类对象。
调用一次 create_demo() 函数,可以看到,demo 对象被创建,地址为 0x7f328f7c6cb0;接着该 demo 对象立即被释放;因为该对象只在 create_demo 函数范围内有效,函数结束,demo 对象就被回收释放。
再调用一次 create_demo() 函数,现象相同:demo 对象被创建,地址为 0x7f328f7c6cb0;接着该 demo 对象立即被释放。
三、函数内部返回的类对象
>>> def return_demo():
... return demo()
...
定义函数 return_demo,该函数内部创建类对象,并且返回创建出的类对象。
>>> True
True
>>> return_demo()
init class
<__main__.demo instance at 0x7fc511eb8cb0>
<__main__.demo instance at 0x7fc511eb8cb0>
>>>
>>> True
del class
<__main__.demo instance at 0x7fc511eb8cb0>
True
>>>
>>> return_demo()
init class
<__main__.demo instance at 0x7fc511eb8cb0>
<__main__.demo instance at 0x7fc511eb8cb0>
>>>
>>>
>>>
>>> True
del class
<__main__.demo instance at 0x7fc511eb8cb0>
True
>>>
>>>
可以看到,第一次调用函数 return_demo(),打印的内容显示,此时创建了一个对象,对象地址为 0x7fc511eb8cb0;函数 return_demo 内部使用 return 语句返回创建的类对象,因此函数返回时,不会释放对象 0x7fc511eb8cb0。
接着,执行一条 Python 语句:True,同时看到对象 0x7fc511eb8cb0 被释放。因为程序执行完 return_demo() 函数之后,发现后面的程序并没有引用 return_demo() 返回的对象,因此 Python 便会释放对象空间 0x7fc511eb8cb0。
第二次执行相同的操作,可以看到现象相同。
>>> v1_demo = None
>>> v2_demo = None
>>> print(v1_demo)
None
>>> print(v2_demo)
None
>>> True
True
>>>
>>> v1_demo = return_demo()
init class
<__main__.demo instance at 0x7fc511eb8d88>
>>>
>>> print(v1_demo)
<__main__.demo instance at 0x7fc511eb8d88>
>>>
>>> True
True
>>>
>>>
>>> v2_demo = return_demo()
init class
<__main__.demo instance at 0x7fc511eb8dd0>
>>>
>>> print(v2_demo)
<__main__.demo instance at 0x7fc511eb8dd0>
>>> True
True
>>>
>>>
>>>
>>>
>>> v1_demo = None
del class
<__main__.demo instance at 0x7fc511eb8d88>
>>>
>>> print(v1_demo)
None
>>>
该代码段的现象和上个代码段的现象基本相同。
可以看到,v1_demo 和 v2_demo 引用了类对象,所以 v1_demo 和 v2_demo 的值不再是 None。
最后,我们让 v1_demo 重新为 None。此时,v1_demo 引用的对象 0x7fc511eb8d88 就被释放了。
1. 使用全局变量 引用 函数内部的类对象
>>> g_demo = None
>>> print(g_demo)
None
>>>
>>> def return_gdemo():
... global g_demo
... g_demo = demo()
...
>>>
>>> print(g_demo)
None
>>> return_gdemo()
init class
<__main__.demo instance at 0x7fc511eb8d88>
>>>
>>> print(g_demo)
<__main__.demo instance at 0x7fc511eb8d88>
>>>
>>> True
True
>>>
相关文章:
python 类对象的析构释放代码演示
文章目录一、类的构造函数与析构函数二、代码演示1. 引用的更迭2. 只在函数内部的类对象三、函数内部返回的类对象1. 使用全局变量 引用 函数内部的类对象一、类的构造函数与析构函数 init 函数是python 类的构造函数,在创建一个类对象的时候,就会自动调…...
Hadoop Shell常用命令
Hadoop Shell命令在管理HDFS的时候还是比较常用的,Hadoop Shell命令与shell命令极为相似,但是方便查询,在这里总结分享,大家enjoy~~ 1,cat 语法格式:hadoop fs -cat URI [URI …] 含义:将路径…...
Android中级——色彩处理和图像处理
色彩处理 通过色彩矩阵处理 色彩矩阵介绍 图像的RGBA可拆分为一个4行5列的矩阵和5行1列矩阵相乘 其中4行5列矩阵即为ColorMatrix,可通过调整ColorMatrix间接调整RGBA 第一行 abcde 决定新的 R第二行 fghij 决定新的 G第三行 klmno 决定新的 G第四行 pqrst 决定新…...
C++类和对象:类的定义、类对象的存储、this指针
目录 一. 对于面向过程和面向对象的认识 二. 类 2.1 struct关键字定义类 2.1.1 C语言中的struct关键字 2.1.2 C中的struct关键字 2.2 class关键字 2.1 使用class关键字定义类 三. 类的访问限定及封装 3.1 类的访问权限及访问限定符 3.1.1 访问权限 3.1.2 访问限定…...
代码随想录算法训练营第三十九天 | 62.不同路径,63. 不同路径 II
一、参考资料不同路径https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html 视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu不同路径 IIhttps://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.htmlhttps://progr…...
数据库复习3
一. 简答题(共1题,100分) 1. (简答题) 存在数据库test,数据库中有如下表: 1.学生表 Student(Sno,Sname,Sage,Ssex) --Sno 学号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 主键Sno 2.教师表 Teacher(Tno,Tname) --T…...
顺序表的增删查改
数据结构 是数据存储的方式,对于不同的数据我们要采用不同的数据结构。就像交通运输,选用什么交通工具取决于你要运输的是人还是货物,以及它们的数量。 顺序存储结构 包括顺序表、链表、栈和队列等。 例如腾讯QQ中的好友列表,…...
jupyter matplotlib中文乱码解决
中文乱码可能有两种情况 1. matplotlib里面有中文字体 2. 没有中文字体 查看是否有中文字体: # 查询当前系统所有字体 from matplotlib.font_manager import FontManager import subprocessmpl_fonts = set(f.name for f in FontManager().ttflist)print(all font list get f…...
Smtplib之发邮件模块
目录 创建Smtp对象 Smtp类中的方法 MIME MIMEBase MIMEBase MIMEMultipart MIMEApplication MIMEAudio MIMEImage MIMEText 实例 texthtml格式 发送带图片附件的邮件 发送带附件的邮件 含多种格式 SMTP模块 SMTP 简单传输协议,它是一组用于由源…...
Android 适配手机和平板
一、屏幕适配限定符Android 系统加载应用资源时 , 会根据当前运行应用的设备的相关属性 , 如 : 屏幕尺寸 / 屏幕像素密度 / 宽高比 / 屏幕方向 等属性 , 加载不同的屏幕适配限定符目录下的资源 ;如 : 横竖屏切换时 , res/layout-land 目录中 , 存放的是横屏布局 , res/layout-p…...
时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测
时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测 目录时序预测 | MATLAB实现LSTM-SVR(长短期记忆神经网络-支持向量机)时间序列预测效果一览基本介绍模型介绍LSTM模型SVR模型LSTM-SVR模型程序设计参考资料致谢效果一览 基本介绍 本次运行测试环境MA…...
分阶段构建golang运行环境Dockerfile镜像
在开始这项工作之前大家可以先去看一下docker官方给出关于空镜像scratch的说明,采用官方简单的一句话就是:scratch是一个明确的空图像,特别是对于“从头开始”构建图像。分阶段构建镜像就会用到scratch这个空镜像,这样的好处是可以…...
Vue-cli脚手架在做些什么(源码角度分析)
什么是Vue脚手架?在学习初期,我们的项目往往需要借助webpack、vite等打包工具配置Vue的开发环境,但是在真实开发中我们不可能每个项目从头来完成所有的webpack配置,这样显得开发的效率会大大的降低;所有的真实开发中&a…...
【Nginx】|入门连续剧——安装
作者:狮子也疯狂 专栏:《Nginx从入门到超神》 坚持做好每一步,幸运之神自然会降临在你的身上 目录一. 🦁 前言Ⅰ. 🐇 为啥我们要使用Nginx?二. 🦁 搭建流程Ⅰ. 🐇 环境准备Ⅱ. &…...
从0开始学python -38
Python3 面向对象-1 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对…...
算法设计与分析期末考试复习(二)
分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。最好使子问题的规模大致相同。 分解(Divide):将一个难以直接解决的大问题,分割成一些规模较小的子…...
九龙证券|4D毫米波雷达成市场新宠,相关概念股大涨,会贡献多少业绩?
近日,4D毫米波雷达成为A股新宠,相关概念股如经纬恒润(688326.SH)一周内涨幅接近20%,威孚高科(000581.SZ)5个买卖日内涨幅超越25%。 有音讯称特斯拉将在3月1日投资者活动日会宣告新款Model 3的全…...
Git天天用,不得不看的那些事
作为一个工作两年的开发同学,git是每天都要接触的工具。但IDEA对git的封装已经满足了日常的代码提交需求,所以一直是以点点点的形式进行代码提交与更新,几乎没用命令行提交过(现在想来也是有些惭愧),对于gi…...
IDE 文档注释使用,模板注释,ide配置templates
文档注释基于javadoc模板 类注释 /*** 暂无介绍** author admin* version 1.0.0* <dt><span class"simpleTagLabel">时间:</span></dt>* <dd>2023/2/24</dd>*/方法注释 /*** 暂无描述** author admin* param args */javadoc相…...
力扣-查询近30天活跃用户数
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1141. 查询近30天活跃用户数二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.其他总结前言 一、题目&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
