0

0

Python自定义上下文管理器___enter__实现

冷漠man

冷漠man

发布时间:2026-03-07 19:45:51

|

596人浏览过

|

来源于php中文网

原创

__enter__ 方法的核心作用是定义进入 with 语句块时执行的操作并决定返回给 as 后变量的对象;它在 with 开始时自动调用,返回值绑定到 as 变量,默认返回 none,常用于资源获取或状态切换,需与 __exit__ 配合确保正确清理。

python自定义上下文管理器___enter__实现

自定义上下文管理器的 __enter__ 方法,核心作用是**定义进入 with 语句块时要执行的操作,并决定返回给 as 后变量的对象**。

__enter__ 的基本职责

__enter__ 是一个实例方法,它在 with 语句开始执行时被自动调用。它的返回值会绑定到 as 后面的变量上。如果没写 return,默认返回 None

  • 常用于资源获取:打开文件、连接数据库、加锁、切换状态等
  • 返回值可以是自身(return self),也可以是其他对象(如文件句柄、连接实例)
  • 若抛出异常,with 块不会执行,直接进入异常处理流程

常见实现方式

最典型的模式是让 __enter__ 返回 self,方便在 with 块中调用该对象的方法:

class DatabaseConnection:
    def __init__(self, url):
        self.url = url
        self.conn = None
<pre class='brush:python;toolbar:false;'>def __enter__(self):
    self.conn = connect_to_db(self.url)  # 实际建立连接
    return self  # 允许 with db as conn: 中的 conn 调用 db 的方法

def __exit__(self, exc_type, exc_val, exc_tb):
    if self.conn:
        self.conn.close()

立即学习Python免费学习笔记(深入)”;

也可以直接返回底层资源,更贴近内置类型习惯:

瑞志企业建站系统(ASP版)2.2
瑞志企业建站系统(ASP版)2.2

支持模板化设计,基于标签调用数据 支持N国语言,并能根据客户端自动识别当前语言 支持扩展现有的分类类型,并可修改当前主要分类的字段 支持静态化和伪静态 会员管理功能,询价、订单、收藏、短消息功能 基于组的管理员权限设置 支持在线新建、修改、删除模板 支持在线管理上传文件 使用最新的CKEditor作为后台可视化编辑器 支持无限级分类及分类的移动、合并、排序 专题管理、自定义模块管理 支持缩略图和图

下载
class FileManager:
    def __init__(self, path, mode='r'):
        self.path = path
        self.mode = mode
        self.file = None
<pre class='brush:python;toolbar:false;'>def __enter__(self):
    self.file = open(self.path, self.mode)  # 打开文件
    return self.file  # with fm as f: 中的 f 就是 file 对象

def __exit__(self, *args):
    if self.file:
        self.file.close()

立即学习Python免费学习笔记(深入)”;

注意点和易错细节

__enter__ 虽然看起来简单,但几个关键细节容易影响行为:

  • 不要在 __enter__ 里做耗时或可能失败但未处理的操作——除非你希望它直接中断 with 流程
  • 如果 __enter__ 返回了对象 A,而 __exit__ 需要清理另一个对象 B,需确保 B 在 A 的生命周期内可访问(通常存为实例属性)
  • 不建议在 __enter__ 中修改外部状态(如全局变量),这会让上下文管理器难以测试和复用
  • __exit__ 配合时,要保证无论 __enter__ 返回什么,__exit__ 都能正确清理已初始化的资源

替代方案:contextlib.contextmanager

如果逻辑简单,用生成器函数配合 @contextmanager 更简洁,yield 之前的代码相当于 __enter__,之后相当于 __exit__

from contextlib import contextmanager
<p>@contextmanager
def timer():
start = time.time()
try:
yield lambda: time.time() - start  # <strong>enter</strong> 返回一个计算耗时的函数
finally:
pass  # <strong>exit</strong> 清理逻辑(这里不需要)</p><h1>使用</h1><p>with timer() as elapsed:
time.sleep(1)
print(f"耗时:{elapsed():.2f}s")

这种写法隐式定义了 __enter__ 行为,无需手动实现类。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

89

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

106

2025.09.18

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

383

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2108

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

420

2023.10.16

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号