百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

中高阶Python常规用法--上下文管理器

off999 2025-05-16 15:35 38 浏览 0 评论

Python 以简单性和通用性著称,是一种深受全球开发人员喜爱的编程语言。它提供了大量的特性和功能,使编码成为一种愉快的体验。在这些功能中,一个经常被新手忽视的强大工具是上下文管理器。上下文管理器是高级构造,可实现简洁高效的资源管理,同时确保正确处理异常和清理操作。在此博客中,我们将深入了解上下文管理器的世界,了解它们是什么、它们如何工作以及它们如何将您的 Python 代码提升到新的高度。

了解上下文管理器:

在 Python 中,上下文管理器是一个对象,它定义了方法 __enter__() 和 __exit__() 以在特定上下文中启用资源管理。它允许您自动分配和释放资源、执行设置和拆卸操作以及优雅地处理异常。

`__enter__()` 方法在上下文的开头执行,您可以在其中设置任何资源或执行必要的初始化。当在“with”语句中使用上下文管理器时,该方法返回将与“as”关键字关联的对象或值。

`__exit__()` 方法在上下文结束时被调用,无论是执行成功还是出现异常。它负责清理资源、关闭文件或连接,或任何其他必要的拆卸操作。它还接收有关在上下文中引发的任何异常的信息,从而提供异常处理的机会。

使用带有 `with` 语句的上下文管理器:

使用上下文管理器的最常见和推荐的方法是使用“with”语句。`with` 语句确保上下文管理器的 `__enter__()` 方法在块的开头被调用,而 `__exit__()` 方法在块的末尾被调用,而不管中间可能发生的任何异常。

考虑以下示例:

with open('file.txt', 'r') as file:


  content = file.read()
  
  print(content)

在上面的代码中,`open()` 函数返回一个处理文件资源的上下文管理器。`with` 语句自动调用 `__enter__()` 方法,打开文件,并将文件对象分配给变量 `file`。执行块后,将调用 __exit__() 方法,即使发生异常也会关闭文件。

创建自定义上下文管理器:

虽然 Python 为许多场景提供了内置上下文管理器,但您也可以通过在类中实现 `__enter__()` 和 `__exit__()` 方法或使用 `contextlib` 模块来创建自己的自定义上下文管理器。

创建自定义上下文管理器允许您封装特定行为并提供可重用和干净的代码。 例如,您可以创建一个数据库连接上下文管理器,自动处理连接的建立和关闭,确保适当的资源管理。

上下文管理器的好处:

上下文管理器提供了几个优势,包括:

1. 资源管理:上下文管理器处理资源的获取和释放,例如文件句柄、数据库连接或网络连接,无需手动清理。

2.异常处理:上下文管理器促进优雅的异常处理。`__exit__()` 方法允许您捕获和处理上下文中引发的异常,从而启用清理操作并防止资源泄漏。

3. 可读性和简洁性:`with` 语句通过消除与资源管理和错误处理相关的样板代码,使代码更具可读性和简洁性。

上面是一些理论的概述,下面我们从实际出发,给大家举几个例子。展示 Python 中上下文管理器的高级特性和功能:

1. 使用上下文管理器处理文件:

class File:


  def __init__(self, filename, mode):
  
    self.filename = filename
    
    self.mode = mode
    
    self.file = None
  
  def __enter__(self):
  
    self.file = open(self.filename, self.mode)
    
    return self.file
  
  def __exit__(self, exc_type, exc_val, exc_tb):
  
    self.file.close()
  
# Usage:


with File('example.txt', 'w') as file:


  file.write('Hello, context managers!')

在此示例中,我们创建了一个自定义上下文管理器“File”,它使用“with”语句自动打开和关闭文件。文件以写入模式打开,内容写入其中。一旦执行了 `with` 块,就会调用 `__exit__()` 方法,关闭文件。

2. 与上下文管理器的数据库连接(使用 `contextlib`):

from contextlib import contextmanager


import sqlite3


@contextmanager


def database_connection(database):


    connection = sqlite3.connect(database)


    cursor = connection.cursor()


    try:


        yield cursor


    finally:


        cursor.close()


        connection.close()


# Usage:


with database_connection('mydb.db') as cursor:


    cursor.execute('SELECT * FROM users')


    result = cursor.fetchall()


    for row in result:


        print(row)

在此示例中,我们使用 contextlib 模块中的 contextmanager 装饰器为 SQLite 数据库连接创建上下文管理器。`yield` 语句允许我们在上下文中与游标进行交互。当“with”块结束时,连接和游标会自动关闭,确保正确的资源管理。

3.定时器上下文管理器:

import time


    class Timer:


    def __enter__(self):


        self.start_time = time.time()


    def __exit__(self, exc_type, exc_val, exc_tb):


        end_time = time.time()


        execution_time = end_time - self.start_time


        print(f"Execution time: {execution_time} seconds")


# Usage:


with Timer():


    # Perform some time-consuming operations


    time.sleep(3)

在此示例中,我们创建了一个简单的计时器上下文管理器,用于测量特定代码块的执行时间。 `__enter__()` 方法记录开始时间,`__exit__()` 方法计算经过的时间并显示。这对于分析代码和优化性能很有用。

这些示例展示了 Python 中上下文管理器的多功能性和强大功能。无论您是处理文件操作、数据库连接还是性能监控,上下文管理器都提供了一种优雅而高效的方式来管理资源和处理异常。

所以理解和使用上下文管理器是每个 Python 开发人员都应该具备的宝贵技能。无论您是在处理文件、数据库还是任何其他需要仔细管理的资源,上下文管理器都提供了一个优雅的解决方案。通过自动处理资源分配、清理操作和异常处理,它们简化了代码,增强可读性,并降低资源泄漏的风险。 因此,拥抱上下文管理器的强大功能并解锁高级 Python 功能,将您的编码工作提升到一个新的水平!

上期问题:我们如何在 Python 中将参数传递给装饰器?

答:在 Python 中,装饰器可以通过引入额外的嵌套层来接受参数。要将参数传递给装饰器,您需要创建一个装饰器工厂函数,它接受所需的参数并返回装饰器本身。下面是一个例子来说明这个概念:

def decorator_factory(argument):


  def decorator(func):
  
    def wrapper(*args, **kwargs):
    
      # Perform additional tasks using the 'argument'
      
      print(f"Decorator argument: {argument}")
    
      return func(*args, **kwargs)
  
  return wrapper
  
return decorator


@decorator_factory("Hello, World!")


def greet():


  print("Greetings!")


greet()

在这个例子中,我们定义了一个接受参数的`decorator_factory`。它返回实际的装饰器函数,它接受目标函数并创建一个包装器。包装函数可以从外部作用域访问“参数”并基于它执行其他任务。当我们将装饰器 @decorator_factory("Hello, World!") 应用于 greet 函数时,它添加了在执行 greet 函数之前打印装饰器参数的额外功能。

此代码的输出将是:

Decorator argument: Hello, World!


Greetings!

利用装饰器工厂,我们可以根据传递给装饰器的参数动态定制装饰器的行为,使装饰器更加灵活,适应各种场景。你学会了吗?点个关注,后面还有更精彩的内容哦!

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: