深入探讨 Python 中的装饰器和上下文管理器

简介: 深入探讨 Python 中的装饰器和上下文管理器

Python 作为一门灵活而强大的语言,提供了许多高级特性,其中装饰器(Decorators)和上下文管理器(Context Managers)是其中两个非常有用的概念。这两个功能性特性提供了对代码结构和行为进行修改和控制的强大工具。它们允许程序员在不修改源代码的情况下,添加、修改或扩展函数或类的功能,帮助编写更优雅、更干净的代码,同时提高代码的可重用性和可维护性。


装饰器(Decorators)


装饰器是函数的函数,它接受一个函数作为参数,并返回一个新的函数。它们提供了一种简洁的方式来包装或修改函数的行为。通过装饰器,可以在不改变原始函数代码的情况下,添加额外的功能或逻辑,如日志记录、性能计时、权限检查等。这种能力使得装饰器成为Python中函数式编程范式的强大工具之一。


基本语法

def decorator_function(func):
    def wrapper(*args, **kwargs):
        # 添加装饰逻辑
        return func(*args, **kwargs)
    return wrapper
    
@decorator_function
def some_function():
    # 函数体
    pass


举例说明:

1. 计时器装饰器

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Execution time: {end_time - start_time} seconds")
        return result
    return wrapper
    
@timer
def some_function():
    time.sleep(2)
    print("Function executed")
    
some_function()
# 输出:Function executed
#      Execution time: 2.000123 seconds


2. 权限检查装饰器

def check_permission(func):
    def wrapper(*args, **kwargs):
        if user_has_permission():
            return func(*args, **kwargs)
        else:
            raise PermissionError("Permission denied")
    return wrapper
    
@check_permission
def sensitive_operation():
    print("Operation executed")
    
sensitive_operation()
# 如果用户有权限,输出:Operation executed
# 如果用户无权限,抛出 PermissionError


上下文管理器(Context Managers)


上下文管理器提供了对资源进行安全获取和释放的机制,即使在出现异常时也能确保资源的释放。这对于处理文件、数据库连接或其他需要资源管理的情况特别有用。上下文管理器可以使用 with 语句来确保在代码块执行前获取资源,在代码块执行后释放资源,保证资源的正确处理。



基本语法


class CustomContextManager:
    def __enter__(self):
        # 分配资源
        return resource
   
    def __exit__(self, exc_type, exc_value, traceback):
        # 释放资源
        pass
        
with CustomContextManager() as resource:
    # 使用资源的代码块
    pass


举例说明:


3. 文件操作的上下文管理器

class FileManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
   
    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file
   
    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()
        
with FileManager("example.txt", "w") as file:
    file.write("Hello, Context Manager!")
# 文件 example.txt 被正确地写入数据,并在代码块结束时自动关闭


4. 数据库连接的上下文管理器

import sqlite3

class DatabaseConnection:
    def __init__(self, database):
        self.database = database
   
    def __enter__(self):
        self.connection = sqlite3.connect(self.database)
        return self.connection
   
    def __exit__(self, exc_type, exc_value, traceback):
        self.connection.close()
        
with DatabaseConnection("example.db") as conn:
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
# 在代码块中成功创建数据库连接,并在结束时自动关闭连接


高阶概念与应用


装饰器链:多个装饰器可以被串联使用,以添加多个功能。

上下文管理器的异步支持:async with 语句在异步代码中管理异步资源的获取和释放。


这些高级特性提供了对 Python 代码逻辑和资源管理更细粒度的控制,使得代码更具灵活性和可维护性。


结语


装饰器和上下文管理器是 Python 中强大而灵活的特性,它们可以使代码更简洁、更易于维护,并且提供了许多便利。


目录
相关文章
|
弹性计算 NoSQL Redis
ECS安装Fedora CoreOS操作系统版本34
ECS安装Fedora CoreOS操作系统版本34
734 0
ECS安装Fedora CoreOS操作系统版本34
|
Linux 虚拟化
VMware虚拟机 用共享文件夹方式 与主机传输文件(图文)
VMware虚拟机 用共享文件夹方式 与主机传输文件(图文)
VMware虚拟机 用共享文件夹方式 与主机传输文件(图文)
|
JavaScript Java 应用服务中间件
使用 Docker 高效搭建本地开发环境(详细教程)
使用 Docker 高效搭建本地开发环境(详细教程)
16062 0
使用 Docker 高效搭建本地开发环境(详细教程)
|
存储 缓存 网络协议
Linux环境下配置虚拟ip,方法1:新增多个子网卡,每个子网卡有独立的配置文件
Linux环境下配置虚拟ip,方法1:新增多个子网卡,每个子网卡有独立的配置文件
6154 0
Linux环境下配置虚拟ip,方法1:新增多个子网卡,每个子网卡有独立的配置文件
“Could not find suitable distribution for Requirement.parse(‘XXXX‘)”的问题
“Could not find suitable distribution for Requirement.parse(‘XXXX‘)”的问题
618 0
|
自然语言处理 数据处理 Python
python操作和解析ppt文件 | python小知识
本文将带你从零开始,了解PPT解析的工具、工作原理以及常用的基本操作,并提供具体的代码示例和必要的说明【10月更文挑战第4天】
2319 60
|
11月前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
2455 7
|
自然语言处理 前端开发 Java
您的智能测试助理来了!蚂蚁TestAgent开源,快来体验!
TestAgent 旨在构建测试领域的“智能体”,融合大模型和质量领域工程化技术,促进质量技术代系升级。我们期望和社区成员一起合作,打造创新的测试领域解决方案,构建24小时在线的测试助理服务,让测试如丝般顺滑。 很高兴地宣布,我们在国内首次开源了测试行业大模型及工具——TestAgent。本次版本包含了性能最强的7B测试领域大模型,以及配套的本地模型快速发布和体验工程化框架,欢迎体验和关注!
2913 0
您的智能测试助理来了!蚂蚁TestAgent开源,快来体验!
|
机器学习/深度学习 分布式计算 大数据
|
存储 弹性计算 安全
阿里云服务器镜像类型及区别参考(公共镜像、镜像市场、自定义镜像等)
阿里云服务器镜像包括公共镜像、镜像市场、自定义镜像、社区镜像、共享镜像,镜像可以满足各类型用户对于应用环境的快速部署、灵活管理的需求。
848 0
阿里云服务器镜像类型及区别参考(公共镜像、镜像市场、自定义镜像等)