【Python】对象生命周期全解析

news2025/5/17 0:27:43

Python对象生命周期全解析

在Python中,一个对象从创建到销毁会经历一系列过程,理解这些过程对于编写高效、可靠的Python代码非常重要。下面我将详细讲解Python对象的完整生命周期。

1. 对象创建阶段

(1) 内存分配

  • 当使用类实例化时(obj = MyClass()),Python解释器首先为对象分配内存
  • 内存分配由Python内存管理器处理

(2) 对象初始化

  • __new__方法被调用,负责创建对象实例
  • __init__方法被调用,负责初始化对象状态
class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ 被调用 - 创建实例")
        instance = super().__new__(cls)
        return instance
    
    def __init__(self, value):
        print("__init__ 被调用 - 初始化实例")
        self.value = value

obj = MyClass(42)  # 输出两行信息

2. 对象使用阶段

(1) 属性访问

  • 通过点号操作符访问属性(obj.attribute)
  • 触发__getattribute____getattr__方法
class MyClass:
    def __getattribute__(self, name):
        print(f"访问属性: {name}")
        return super().__getattribute__(name)
    
    def __getattr__(self, name):
        print(f"访问不存在的属性: {name}")
        return None

obj = MyClass()
obj.value  # 访问存在的属性
obj.missing  # 访问不存在的属性

(2) 方法调用

  • 方法调用实际上是属性查找后跟着函数调用

(3) 特殊方法调用

  • 各种操作符重载(__add__, __sub__等)
  • 容器操作(__getitem__, __setitem__等)

3. 对象销毁阶段

(1) 引用计数减少

  • Python使用引用计数作为主要垃圾回收机制
  • 当引用计数降为0时,对象被标记为可回收

(2) __del__方法调用

  • 对象被销毁前,__del__方法(析构器)被调用
  • 注意:不保证在所有情况下都会执行
class MyClass:
    def __del__(self):
        print("对象即将被销毁")

obj = MyClass()
del obj  # 输出"对象即将被销毁"

(3) 内存回收

  • 对象占用的内存被回收,返回给内存池

4. 完整生命周期示例

class LifecycleDemo:
    def __new__(cls, *args, **kwargs):
        print("1. __new__ - 创建实例")
        return super().__new__(cls)
    
    def __init__(self, name):
        print("2. __init__ - 初始化实例")
        self.name = name
    
    def __getattribute__(self, name):
        print(f"3. 访问属性: {name}")
        return super().__getattribute__(name)
    
    def method(self):
        print("4. 方法调用")
    
    def __del__(self):
        print("5. __del__ - 对象即将销毁")

print("== 开始生命周期 ==")
obj = LifecycleDemo("测试对象")  # 1, 2
obj.method()                   # 3, 4
print("== 结束引用 ==")
del obj                        # 5
print("== 生命周期结束 ==")

5. 重要注意事项

  1. __del__的不可靠性

    • 不保证一定会执行(特别是在程序异常退出时)
    • 不应依赖它来释放关键资源
  2. 循环引用问题

    • 引用计数无法处理循环引用
    • Python的垃圾收集器(GC)会处理,但可能造成延迟
  3. 上下文管理器

    • 对于资源管理,推荐使用with语句和上下文管理器协议(__enter__, __exit__)
class Resource:
    def __enter__(self):
        print("获取资源")
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("释放资源")
    
    def operate(self):
        print("使用资源")

with Resource() as res:
    res.operate()
  1. 弱引用
    • 使用weakref模块可以创建不增加引用计数的引用

理解Python对象的完整生命周期可以帮助你:

  • 编写更高效的代码
  • 更好地管理资源
  • 避免内存泄漏
  • 实现更健壮的类设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WF24 wifi/蓝牙模块串口与手机蓝牙通信

usb-ttl ch340接线 打开串口工具SSCOM,端口号选择ch340接的那个口,波特率改成115200 DX-SMART_2.0.5.apk下载 手机打开DX-SMART软件 点击透传-搜索BLE-连接WF24-BLE 连接成功串口会收到消息 [14:37:10.591]收←◆ BLE_CONNECT_SUCCESS发送命令ATBLUFI…

通义千问席卷日本!开源界“卷王”阿里通义千问成为日本AI发展新基石

据日本经济新闻(NIKKEI)报道,通义千问已成为日本AI开发的新基础,其影响力正逐步扩大,深刻改变着日本AI产业的格局。 同时,日本经济新闻将通义千问Qwen2.5-Max列为全球AI模型综合评测第六名,不仅…

流程编辑器Bpmn与LogicFlow学习

工作流技术如何与用户交互结合(如动态表单、任务分配)处理过 XML 与 JSON 的转换自定义过 bpmn.js 的样式(如修改节点颜色、形状、图标)扩展过上下文菜单(Palette)或属性面板(Properties Panel&…

Figma 新手教程学习笔记

📺 视频地址:Figma新手教程2025|30分钟高效掌握Figma基础操作与UI设计流程_哔哩哔哩_bilibili 🧭 课程结构 Figma 简介(00:38) 熟悉工作环境(01:49) 操作界面介绍(03:…

配置Spark环境

1.上传spark安装包到某一台机器(自己在finaShell上的机器)。 2.解压。 把第一步上传的安装包解压到/opt/module下(也可以自己决定解压到哪里)。对应的命令是:tar -zxvf 安装包 -C /opt/module 3.重命名。进入/opt/mo…

Window下Jmeter多机压测方法

1.概述 Jmeter多机压测的原理,是通过单个jmeter客户端,控制多个远程的jmeter服务器,使他们同步的对服务器进行压力测试。 以此方式收集测试数据的好处在于: 保存测试采样数据到本地机器通过单台机器管理多个jmeter执行引擎测试…

视频图像压缩领域中 DCT 的 DC 系数和 AC 系数详解

引言 在数字图像与视频压缩领域,离散余弦变换(Discrete Cosine Transform, DCT)凭借其卓越的能量集中特性,成为JPEG、MPEG等国际标准的核心技术。DCT通过将空域信号映射到频域,分离出DC系数(直流分量&…

能源设备数据采集

在全球可持续发展目标与环境保护理念日益深入人心的时代背景下,有效管理和优化能源使用已成为企业实现绿色转型、提升竞争力的关键路径。能源设备数据采集系统,作为能源管理的核心技术支撑,通过对各类能源生产设备运行数据的全面收集、深度分…

Go语言安装proto并且使用gRPC服务(2025最新WINDOWS系统)

1.protobuf简介 protobuf 即 Protocol Buffers,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化。protobuf 性能和效率大幅度优于 JSON、XML 等其他的结构化数据格式。protobuf 是以二进制方式存储的,占用空…

[Linux性能优化] 线程卡顿优化。Linux加入USB(HID)热插拔线程占用CPU优化。Linux中CPU使用率过高优化

文章目录 [Linux性能优化] 线程卡顿优化。0、省流版本一、问题定位:CPU 资源分析二、线程卡顿现场复现线程优化前图片 三、线程卡顿优化方向1.如果是轮询方式2.如果是事件驱动方式 四、修改方式线程优化后图片 [Linux性能优化] 线程卡顿优化。 0、省流版本 如果采…

Ubuntu20.04下如何源码编译Carla,使用UE4源码开跑,踩坑集合

一、简介 作为一个从事算法研究的人员,无人驾驶仿真一直是比较重要的一部分,但是现在比较常见的算法验证都是在carla这个开源仿真平台上做的,所以我有二次开发carla的需求,今天就来讲讲编译CARLA。 网上的教材很多,但还是推荐大家看官网教程:Linux build - CARLA Simul…

26考研——中央处理器_数据通路的功能和基本结构(5)

408答疑 文章目录 三、数据通路的功能和基本结构数据通路的功能数据通路的组成组合逻辑元件(操作元件)时序逻辑元件(状态元件) 数据通路的基本结构CPU 内部单总线方式CPU 内部多总线方式专用数据通路方式 数据通路的操作举例通用寄…

区块链大纲笔记

中心化出现的原因是由于网络的形成(不然就孤立了,这显然不符合现实,如,社会,计算机网路),接着由于网络中结点能力一般不对等同时为了便于管理等一系列问题,导致中心化网络的出现。&a…

浏览器自动化:RPA 解决方案的崛起

1. 引言 在 2025 年,浏览器自动化已成为企业和开发者不可或缺的工具。从网页数据抓取到自动化测试,这项技术不仅提高了效率,还推动了 Web 生态的发展。然而,随着浏览器指纹识别和反机器人检测的进步,传统的本地自动化…

手机换地方ip地址会变化吗?深入解析

在移动互联网时代,我们经常带着手机穿梭于不同地点,无论是出差旅行还是日常通勤。许多用户都好奇:当手机更换使用地点时,IP地址会随之改变吗?本文将深入解析手机IP地址的变化机制,帮助您全面了解这一常见但…

AI工具分享篇 | recraft.ai + figma 复刻技术路线图

recraft 介绍 recraft.ai 主要生成和编辑适合网站、印刷和营销的各种风格的矢量艺术、图标、3d图像和插图。其矢量化功能可将路线图转化为一个矢量图。 recraft 的注册流程非常的简单,邮箱注册即可,无需科学上网,3分钟就能搞定。看不懂英文…

部署安装jenkins.war(2.508)

实验目的:部署jenkins,并与gitlab关联bulid 所需软件:jdk-17_linux-x64_bin.tar.gz jenkins.war apache-tomcat-10.1.40.tar.gz 实验主机:8.10具有java环境,内存最少为4G,cpu双核 目录 jdk安装 …

JS手写代码篇---手写 Object.create

JS手写代码篇 在做手写题的时候,我们要思考两个问题 这个代码的作用是什么能够实现的效果是什么样子 1. 手写 Object.create 思路:创造一个对象,类似于Object.create()方法>将obj作为原型 // 手写 Object.create function create (ob…

spring boot Controller 和 RestController 的区别

spring boot Controller 和 RestController 的区别 5.3.1常用注解 Spring MVC控制器中常使用的注解有如下几种。 Controller Controller 标记在类上。使用Controller 标记的类表示是Spring MVC的Controller对象。分发处理器将会扫描使用了该注解的类,并检测其中的…

LeRobot 项目部署运行逻辑(七)—— ACT 在 Mobile ALOHA 训练与部署

全部流程为:硬件配置 -> 环境安装 -> 遥操作数据采集 -> 数据集可视化 -> 策略训练 -> 策略评估 在之前的笔记中已经完成了绝大部分,最后再记录一下最后的训练部署,算是最简单的部分了 目录 1 ACT 训练 2 ALOHA 部署 3 更…