首页 > 编程语言 >Python 装饰器

Python 装饰器

时间:2024-10-11 14:59:29浏览次数:10  
标签:__ function Python contextmanager print 装饰 def

Python 装饰器

1. 装饰器是什么

装饰器是 Python 中的一种高级函数,用于在不修改原始函数代码的前提下,动态地为函数或类增加功能。它本质上是一个函数,接受另一个函数或类作为参数,并返回一个新的函数或类。

装饰器的基本语法

def decorator(func):
    def wrapper(*args, **kwargs):
        # 在调用函数之前添加额外的行为
        print("Before the function call")
        result = func(*args, **kwargs)
        # 在调用函数之后添加额外的行为
        print("After the function call")
        return result
    return wrapper

@decorator
def my_function():
    print("This is the main function")

# 调用时
my_function()

输出:

Before the function call
This is the main function
After the function call

多个装饰器

多个装饰器可以叠加使用,每个装饰器会按顺序应用:

@decorator1
@decorator2
def my_function():
    pass

装饰器的应用顺序是从内到外:首先应用 @decorator2,然后是 @decorator1

自定义装饰器

可以根据需要自定义装饰器,为函数增加日志记录、权限检查、缓存等功能。

def custom_decorator(func):
    def wrapper(*args, **kwargs):
        print("Custom behavior before the function")
        return func(*args, **kwargs)
    return wrapper

@custom_decorator
def example():
    print("Original function behavior")

2. 常见的装饰器

@property

@property 装饰器将类的方法转化为属性,可以通过点操作符访问,而不是调用它作为一个函数。

class MyClass:
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        return self._value

obj = MyClass(10)
print(obj.value)  # 直接访问属性,不用加括号

@staticmethod@classmethod

  • @staticmethod:定义静态方法,不能访问类的实例或类本身。
  • @classmethod:定义类方法,第一个参数是类本身 cls,可以访问类的属性和方法。
class MyClass:
    @staticmethod
    def static_method():
        print("This is a static method")

    @classmethod
    def class_method(cls):
        print("This is a class method")

MyClass.static_method()
MyClass.class_method()

3. @contextmanager

@contextmanager 是 Python 标准库中的 contextlib 模块提供的一个装饰器,用于简化上下文管理器的编写,使得我们可以通过 with 语句安全地管理资源(如文件、数据库连接等),确保资源的正确获取与释放。

@contextmanager 的使用

通过 @contextmanager,可以使用简单的生成器函数代替编写完整的上下文管理类。

from contextlib import contextmanager

@contextmanager
def open_file(file_name):
    f = open(file_name, 'r')
    try:
        yield f  # 提供上下文管理的资源
    finally:
        f.close()  # 确保在退出时关闭文件

# 使用上下文管理器
with open_file('test.txt') as f:
    content = f.read()
    print(content)

with 语句

with 语句是 Python 中管理资源的常用方式,它能够确保在块结束时自动释放资源,不论是否发生异常。

with open('file.txt', 'r') as f:
    data = f.read()

with 语句背后的机制是对象实现了上下文管理协议,即实现了 __enter____exit__ 方法。

@contextmanager 的内部原理

@contextmanager 是通过生成器的 yield 语句来切分上下文进入和退出的时机。在 yield 之前的部分相当于 __enter__,而在 yield 之后的部分相当于 __exit__,用于管理资源的释放。

自定义上下文管理器的完整类实现

除了 @contextmanager,你还可以通过类的 __enter____exit__ 方法来实现上下文管理器。

class MyContextManager:
    def __enter__(self):
        print("Entering the context")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Exiting the context")

with MyContextManager() as manager:
    print("Inside the with block")

@contextmanager 与对象初始化的区别

需要注意的是,@contextmanager 仅用于创建上下文管理器,与对象的初始化过程(即类的 __init__ 方法)无关。对象的初始化通常不涉及资源管理,因此不需要使用 @contextmanager

4. 装饰器与上下文管理器的应用场景

  • 装饰器:适用于增强函数功能、添加日志记录、权限控制、缓存等场景。
  • 上下文管理器:适用于需要明确资源管理的场景,如文件、数据库连接的打开与关闭。

标签:__,function,Python,contextmanager,print,装饰,def
From: https://www.cnblogs.com/ganph/p/18458420

相关文章

  • 教你如何免费获取股票数据用python、JavaScript (Node.js)、JAVA等多种语言的实例代码
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • centos7 安装Python3及配置环境变量
    centos7安装Python3并配置环境变量亲测有效python官网(linux下载地址、版本可自选):https://www.python.org/ftp/python/一、添加阿里云第三方扩展源仓库(安装拓展源仓库才能安装yum安装openssl11openssl11-devel,python源码编译必须要openssl11或以上版本)备注,我这里是把pyhto......
  • 雷达图怎么绘制?!超简单,一次性告诉你Python和R绘制方法~~
    今天给大家介绍的的图表为雷达图(Radar/Spiderchart),这种类型图表在生活中较常使用,是一种以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法。较常用的场景多为分析企业经营状况(收益性、生产性、流动性、安全性和成长性)。本期推文......
  • python 09-pycharm连接远程服务器
    准备一个云服务器(linux操作系统)找一个免费试用的服务器用于练习,这里用这个服务器:在pycharm中连接服务器‌-VirtualEnvironment‌:‌Python的虚拟环境,‌允许每个项目拥有独立的库和解释器,‌避免依赖冲突。‌通过virtualenv等工具创建,‌适用于隔离项目依赖。‌‌-Sy......
  • Jupyter Notebook 中同时使用 Python 和 R
    要在JupyterNotebook中同时使用Python和R,可以通过rpy2库来实现。以下是具体步骤:安装rpy2(如果尚未安装):pipinstallrpy2在JupyterNotebook中加载R包:可以在Python代码单元中使用rpy2的importr函数来加载R包。下面是一个示例代码,展示如何加载neuroba......
  • python scapy发包、抓包、分析
    importosimporttelnetlibfromscapy.allimport*fromscapy.layers.inetimport*fromscapy.allimportsniff#pac=dir(scapy.layers)#print(pac)#执行代码后,会输出Scapy中的各层#print(explore(scapy.layers.l2))#查看各种二层协议#print(explore(sc......
  • Python+Layui后台管理
    项目简介:主要分为这几个模块:创建任务、发布任务、任务清单、修改任务、取消任务、个人填写日志、日志记录。1.任务列表模糊查询:提供搜索框,支持用户输入关键词进行模糊查询。操作按钮:分配任务、公司内部创建任务2.公司内部创建任务任务表单主要是有:客户单位、合同名称、联系......
  • Python高级库与框架:提升你的开发效率
    引言在Python的世界中,有着无数强大且灵活的库和框架,它们大大提升了开发的效率和能力。无论是在数据分析、机器学习、Web开发,还是爬虫等领域,掌握这些高级库与框架都能帮助你更快速地完成任务。不过,新手在使用这些库和框架时,常常会遇到一些困难和误区。今天,我们将一起探索一些流......
  • 基于YOLO11/v10/v8/v5深度学习的安检X光危险品检测与识别系统设计与实现【python源码+
    《博主简介》小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~......
  • Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测
    全文链接:https://tecdat.cn/?p=37839原文出处:拓端数据部落公众号 分析师:KefanYu在大众旅游蓬勃发展的背景下,乡村旅游已成为推动乡村经济、社会和文化发展的关键力量。当前,乡村旅游接待设施主要以招待所、小宾馆和农家乐等形式存在。然而,一方面这些设施的接待能力有限,另一方......