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

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

off999 2025-05-16 15:35 2 浏览 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!

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

相关推荐

独家 | 5 个Python高级特性让你在不知不觉中成为Python高手

你已经使用Python编程了一段时间,编写脚本并解决各种问题。是你的水平出色吗?你可能只是在不知不觉中利用了Python的高级特性。从闭包(closure)到上下文管理器(contextmana...

Python装饰器

Python装饰器是一种用于修改函数或类的行为的特殊语法。它们允许在不修改原始代码的情况下,通过将函数或类作为参数传递给另一个函数来添加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数,并返...

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

Python以简单性和通用性著称,是一种深受全球开发人员喜爱的编程语言。它提供了大量的特性和功能,使编码成为一种愉快的体验。在这些功能中,一个经常被新手忽视的强大工具是上下文管理器。上下文管理器是高...

Python小案例67- 装饰器

Python装饰器是一种用于修改函数或类的行为的特殊语法。它们允许在不修改原始代码的情况下,通过将函数或类作为参数传递给另一个函数来添加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数,并返...

python常用的语法糖

概念Python的语法糖(SyntacticSugar)是指那些让代码更简洁、更易读的语法特性,它们本质上并不会增加新功能,但能让开发者更高效地编写代码。推导式写法推导式是Python最经典的...

python - 常用的装饰器 decorator 有哪些?

python编程中使用装饰器(decorator)工具,可以使代码更简洁清晰,提高代码的重用性,还可以为代码维护提供方便。对于python初学者来说,根据装饰器(decorator)的字面意思并不...

python数据缓存怎么搞 ?推荐一个三方包供你参考,非常简单好用。

1.数据缓存说明数据缓存可以说也是项目开发中比不可少的一个工具,像我们测试的系统中,你都会见到像Redis一样的数据缓存库。使用缓存数据库的好处不言而喻,那就是效率高,简单数据直接放在缓存中...

用于时间序列数据的Graphite监视工具

结合第三方工具,Graphite为IT性能监控提供了许多好处。本文介绍其核心组件,包括Carbon、Whisper以及安装的基本准则。Graphite监视工具可实时或按需,大规模地绘制来自多个来源的时...

Python3+pygame实现的坦克大战

一、显示效果二、代码1.说明几乎所有pygame游戏,基本都遵循一定的开发流程,大体如下:初始化pygame创建窗口while循环检测以及处理事件(鼠标点击、按键等)更新UI界面2.代码创建一个m...

Python之鸭子类型:一次搞懂with与上下文装饰器

引言在鸭子类型的理念的基础之上,从关注类型,转变到关注特性和行为。结合Python中的魔法函数的体系,我们可以将自定义的类型,像内置类型一样被使用。今天这篇文章中,接着该话题,继续聊一下with语法块...

Python必会的50个代码操作

学习Python时,掌握一些常用的程序操作非常重要。以下是50个Python必会的程序操作,主要包括基础语法、数据结构、函数和文件操作等。1.HelloWorldprint("Hello,...

一文掌握Python 中的同步和异步

同步代码(Sync)同步就像在一个流水线上工作,每个任务都等待前一个任务完成。示例:机器A切割钢板→完成后,机器B钻孔→完成后,机器C上色。在Python中,同步代码看起来像这样:im...

python 标注模块timeit: 测试函数的运行时间

在Python中,可以使用内置的timeit模块来测试函数的运行时间。timeit模块提供了一个简单的接口来测量小段代码的执行时间。以下是使用timeit测试函数运行时间的一般步骤:导入...

Python带你找回童年的万花尺

还记得小时候的万花尺吧?这么画:一点也不费脑筋,就可以出来这么多丰富多彩的复杂几何图形。具体而言,可以用万花尺玩具(如图2-1所示)来绘制数学曲线。这种玩具由两个不同尺寸的塑料齿轮组成,一大一小。小的...

Python 时间模块深度解析:从基础到高级的全面指南

直接上干货一、时间模块核心类介绍序号类名说明1datetime.datetime表示一个具体的日期和时间,结合了日期和时间的信息。2datetime.date表示一个具体的日期。3datetime.t...

取消回复欢迎 发表评论: