Python深入学习之上下文管理器

上下文管理器(context manager)是python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with…as…

关闭文件

我们会进行这样的操作:打开文件,读写,关闭文件。程序员经常会忘记关闭文件。上下文管理器可以在不需要文件的时候,自动关闭文件。

下面我们看一下两段程序:

代码如下:

# without context manager
f = open(“new.txt”, “w”)
print(f.closed)               # whether the file is open
f.write(“Hello World!”)
f.close()
print(f.closed)

以及:

代码如下:

# with context manager
with open(“new.txt”, “w”) as f:
    print(f.closed)
    f.write(“Hello World!”)
print(f.closed)

两段程序实际上执行的是相同的操作。我们的第二段程序就使用了上下文管理器 (with…as…)。上下文管理器有隶属于它的程序块。当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 (我们通过f.closed来查询文件是否关闭)。我们相当于使用缩进规定了文件对象f的使用范围。

上面的上下文管理器基于f对象的__exit__()特殊方法(还记得我们如何利用特殊方法来实现各种语法?参看特殊方法与多范式)。当我们使用上下文管理器的语法时,我们实际上要求Python在进入程序块之前调用对象的__enter__()方法,在结束程序块的时候调用__exit__()方法。对于文件对象f来说,它定义了__enter__()和__exit__()方法(可以通过dir(f)看到)。在f的__exit__()方法中,有self.close()语句。所以在使用上下文管理器时,我们就不用明文关闭f文件了。

自定义

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

任何定义了__enter__()和__exit__()方法的对象都可以用于上下文管理器。文件对象f是内置对象,所以f自动带有这两个特殊方法,不需要自定义。

下面,我们自定义用于上下文管理器的对象,就是下面的myvow:

代码如下:

# customized object

class VOW(object):
    def __init__(self, text):
        self.text = text
    def __enter__(self):
        self.text = “I say: ” + self.text    # add prefix
        return self                          # note: return an object
    def __exit__(self,exc_type,exc_value,traceback):
        self.text = self.text + “!”          # add suffix

with VOW(“I’m fine”) as myvow:
    print(myvow.text)

print(myvow.text)

我们的运行结果如下:

代码如下:

I say: I’m fine
I say: I’m fine!

我们可以看到,在进入上下文和离开上下文时,对象的text属性发生了改变(最初的text属性是”I’m fine”)。

__enter__()返回一个对象。上下文管理器会使用这一对象作为as所指的变量,也就是myvow。在__enter__()中,我们为myvow.text增加了前缀 (“I say: “)。在__exit__()中,我们为myvow.text增加了后缀(“!”)。

注意: __exit__()中有四个参数。当程序块中出现异常(exception),__exit__()的参数中exc_type, exc_value, traceback用于描述异常。我们可以根据这三个参数进行相应的处理。如果正常运行结束,这三个参数都是None。在我们的程序中,我们并没有用到这一特性。

总结:

通过上下文管理器,我们控制对象在程序不同区间的特性。上下文管理器(with EXPR as VAR)大致相当于如下流程:

代码如下:

# with EXPR as VAR:

VAR = EXPR
VAR = VAR.__enter__()
try:
    BLOCK
finally:
    VAR.__exit__()

由于上下文管理器带来的便利,它是一个值得使用的工具。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2303199.html

(0)
上一篇 2025年2月28日 06:55:47
下一篇 2025年2月28日 06:56:05

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • DeepSeek如何本地部署-探索DeepSeek本地部署全面指南

    deepseek本地部署指南:高效运行深度学习模型 DeepSeek是一款强大的本地部署深度学习工具,专为AI开发者打造。本文将指导您完成DeepSeek的本地部署,并提供一些实用技巧,助您快速上手。 DeepSeek本地部署步骤 首先,请…

    2025年3月29日
    100
  • deepseek怎么用python调用

    在开始之前,请确保你的计算机上已安装python和pip。打开命令提示符(windows)或终端(mac/linux),输入以下命令来验证python和pip的安装情况: “` python –version pip…

    2025年3月29日
    100
  • 普通人怎样高效利用DeepSeek-DeepSeek使用技巧助普通人一臂之力

    在当今信息爆炸的时代,高效地获取和处理数据成为了我们日常生活和工作中不可或缺的技能。deepseek作为一款强大的数据搜索与分析工具,为普通人提供了一个便捷的途径来挖掘隐藏在海量数据中的宝贵信息。接下来,我们将详细介绍普通人如何用好deep…

    2025年3月29日
    100
  • 一键搭建DeepSeek-详尽指南教你如何本地部署DeepSeek

    本文将指导您如何在本地环境快速部署deepseek,无需繁琐配置。只需几步,即可轻松运行deepseek。 准备工作: 确保您的系统符合DeepSeek的最低运行要求,并已安装所有必要依赖项。 下载脚本: 从官方GitHub仓库获取最新的一…

    2025年3月29日
    100
  • deepseek怎么编程

    DeepSeek并非编程语言,而是深度搜索概念。实现DeepSeek需基于现有语言选择。针对不同应用场景,需要选择合适的语言和算法,并结合机器学习技术。代码质量、可维护性、测试至关重要。根据需求选择合适的编程语言、算法和工具,并编写高质量代…

    2025年3月29日
    100
  • 怎么下载deepseek 小米

    如何下载 DeepSeek 小米?在小米应用商店搜索“DeepSeek”,如未找到,则继续步骤 2。确定您的需求(搜索文件、数据分析),并找到包含 DeepSeek 功能的相应工具(如文件管理器、数据分析软件)。 怎么下载DeepSeek小…

    2025年3月29日
    100
  • deepseek该怎么搜索

    直接使用DeepSeek自带的搜索功能即可,它强大的语义分析算法能准确理解搜索意图,提供相关信息。但对于冷门领域、最新信息或需要思考问题的搜索,需要调整关键词或使用更具体的描述、结合其他实时信息来源,并明白DeepSeek只是一个工具,需要…

    2025年3月29日
    100
  • deepseek怎么问他

    有效使用DeepSeek的关键在于清晰提问:直接、具体地表达问题。提供具体细节和背景信息。对于复杂的询问,包含多个角度和反驳观点。关注特定方面,例如代码的性能瓶颈。对得到的答案保持批判性思维,结合专业知识进行判断。 DeepSeek怎么问它…

    2025年3月29日
    100
  • DeepSeek本地部署如何操作-DeepSeek本地安装步骤指南

    deepseek本地部署详解:快速搭建专属数据搜索平台 DeepSeek是一款功能强大的数据搜索与分析工具,本文将指导您完成DeepSeek的本地部署,构建高效的信息检索平台。 准备工作: 系统要求: 请确保您的服务器或电脑满足DeepSe…

    2025年3月29日
    100
  • deepseek怎么用来算账

    问题:DeepSeek是否可用于会计?回答:不是,它是一个数据挖掘和分析工具,可用于分析财务数据,但本身不具备会计软件的账目记录和报表生成功能。使用DeepSeek分析财务数据需要:编写代码来处理数据具备对数据结构、算法和DeepSeek …

    2025年3月29日
    100

发表回复

登录后才能评论