Python 装饰器高级应用指南

Python闭包(Closure)与装饰器(Decorator)入门指南 本文详细介绍了Python中的闭包和装饰器,这两个特性在提升代码可重用性和可维护性方面具有重要作用。闭包是指函数能够记住并访问其词法作用域中的变量,即使函数在其原始作用域之外执行。装饰器则是一种高阶函数,接受函数作为参数并返回函数,用于在不修改原函数代码的情况下扩展其功能。文章深入解析了闭包的基本概念、与普通函数的对比以及典型应用,如计数器和函数工厂模式。同时,全面剖析了装饰器的基本语法、与直接函数调用的对比、带参数的装饰器及其应用场景。此外,还探讨了闭包与装饰器的结合应用,如函数执行时间统计和缓存装饰器实 阅读详情

Python 装饰器高级应用指南

1. 什么是装饰器?

装饰器是 Python 中一种特殊的语法结构,用于修改函数或类的行为。它允许我们在不修改原函数代码的情况下,为函数添加额外的功能。

2. 基本语法

装饰器使用 @ 符号来应用,放在函数定义的上方。

@decorator
def function():
    pass

3. 装饰器的实现

3.1 简单装饰器

def my_decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
    return wrapper

@my_decorator
def say_hello():
    print("Hello")

say_hello()
# 输出:
# Before function call
# Hello
# After function call

3.2 带参数的装饰器

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def say_hello(name):
    print(f"Hello, {name}!")

say_hello("Alice")
# 输出:
# Hello, Alice!
# Hello, Alice!
# Hello, Alice!

3.3 保留函数元数据

使用 functools.wraps 可以保留原函数的元数据,如函数名、文档字符串等。

import functools

def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        """Wrapper function"""
        print("Before function call")
        result = func(*args, **kwargs)
        print("After function call")
        return result
    return wrapper

@my_decorator
def say_hello():
    """Say hello function"""
    print("Hello")

print(say_hello.__name__)  # 输出: say_hello
print(say_hello.__doc__)   # 输出: Say hello function

4. 高级应用

4.1 类装饰器

类装饰器是使用类来实现的装饰器,它通过 __call__ 方法来实现装饰功能。

class CountCalls:
    def __init__(self, func):
        self.func = func
        self.count = 0
    
    def __call__(self, *args, **kwargs):
        self.count += 1
        print(f"Call {self.count} of {self.func.__name__}")
        return self.func(*args, **kwargs)

@CountCalls
def say_hello():
    print("Hello")

say_hello()  # 输出: Call 1 of say_hello
             #       Hello
say_hello()  # 输出: Call 2 of say_hello
             #       Hello

4.2 装饰器链

多个装饰器可以同时应用到一个函数上,形成装饰器链。

def decorator1(func):
    def wrapper(*args, **kwargs):
        print("Decorator 1 before")
        result = func(*args, **kwargs)
        print("Decorator 1 after")
        return result
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        print("Decorator 2 before")
        result = func(*args, **kwargs)
        print("Decorator 2 after")
        return result
    return wrapper

@decorator1
@decorator2
def say_hello():
    print("Hello")

say_hello()
# 输出:
# Decorator 1 before
# Decorator 2 before
# Hello
# Decorator 2 after
# Decorator 1 after

4.3 带状态的装饰器

装饰器可以保持状态,例如缓存函数结果。

import functools

def cache(func):
    """Cache function results"""
    cache_dict = {}
    
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        key = str(args) + str(kwargs)
        if key not in cache_dict:
            cache_dict[key] = func(*args, **kwargs)
        return cache_dict[key]
    
    return wrapper

@cache
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(30))  # 第一次计算,会缓存结果
print(fibonacci(30))  # 直接从缓存获取结果

4.4 装饰器工厂

装饰器工厂是返回装饰器的函数,允许我们为装饰器提供配置参数。

def log_level(level):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            print(f"[{level.upper()}] Calling {func.__name__}")
            result = func(*args, **kwargs)
            print(f"[{level.upper()}] {func.__name__} completed")
            return result
        return wrapper
    return decorator

@log_level("info")
def process_data(data):
    print(f"Processing data: {data}")
    return data * 2

@log_level("error")
def handle_error():
    print("Handling error")

process_data(42)  # 输出: [INFO] Calling process_data
                  #       Processing data: 42
                  #       [INFO] process_data completed

handle_error()    # 输出: [ERROR] Calling handle_error
                  #       Handling error
                  #       [ERROR] handle_error completed

5. 实际应用场景

5.1 日志记录

def log_function(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}, kwargs: {kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@log_function
def add(a, b):
    return a + b

add(3, 5)  # 输出调用信息和返回值

5.2 性能计时

import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time:.4f} seconds")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(1)
    return "Done"

slow_function()  # 输出执行时间

5.3 权限验证

def require_permission(permission):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            # 假设当前用户权限存储在 current_user.permissions 中
            current_user = {"permissions": ["read", "write"]}
            if permission not in current_user["permissions"]:
                raise PermissionError(f"Required permission: {permission}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@require_permission("write")
def create_post(content):
    print(f"Creating post: {content}")
    return "Post created"

@require_permission("admin")
def delete_post(post_id):
    print(f"Deleting post: {post_id}")
    return "Post deleted"

create_post("Hello World")  # 成功执行
try:
    delete_post(1)
except PermissionError as e:
    print(e)  # 抛出权限错误

5.4 输入验证

def validate_input(*types):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            for arg, type_ in zip(args, types):
                if not isinstance(arg, type_):
                    raise TypeError(f"Expected {type_}, got {type(arg)}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@validate_input(int, str)
def process_user(user_id, name):
    print(f"Processing user {user_id}: {name}")
    return f"User {user_id} processed"

process_user(1, "Alice")  # 成功执行
try:
    process_user("1", "Alice")
except TypeError as e:
    print(e)  # 抛出类型错误

6. 最佳实践

  1. 使用 functools.wraps:保留原函数的元数据。
  2. 保持装饰器简单:每个装饰器只负责一项功能。
  3. 使用装饰器工厂:当需要为装饰器提供参数时。
  4. 文档化装饰器:为装饰器添加清晰的文档字符串。
  5. 测试装饰器:确保装饰器在各种情况下都能正常工作。

7. 总结

装饰器是 Python 中非常强大的功能,它允许我们以一种简洁、优雅的方式修改函数或类的行为。通过掌握装饰器的高级应用,我们可以编写更加模块化、可维护的代码。

在实际应用中,装饰器可以用于日志记录、性能计时、权限验证、输入验证等多种场景,大大提高了代码的可读性和可维护性。

希望本文对你理解和应用 Python 装饰器有所帮助!

HP iLO4报错自救指南:Embedded Flash/SD-CARD故障的3种修复方案(附详细截图) 本文详细解析了HP iLO4出现'Embedded Flash/SD-CARD'故障时的3种修复方案,包括快速恢复、固件级修复和硬件级解决方案。通过Diagnostics诊断和Self-Test报告,帮助运维人员高效解决问题,并提供预防性维护建议,确保服务器远程管理功能的稳定性。 阅读详情

相关推荐

如何在n8n中高效调用playwright-mcp实现浏览器自动化(附避坑指南)

本文详细介绍了在n8n中高效集成playwright-mcp实现浏览器自动化的全流程指南,包括环境准备、工作流设计与优化、高级技巧与性能调优以及调试与问题排查。通过克服实际部署中的各种挑战,帮助用户打造稳定高效的自动化解决方案,特别适合需要浏览器自动化的工作流场景。

weixin_30379531的博客 388

[Python] 类装饰器

在Python中,是一个装饰器(decorator),用于定义抽象方法(abstract method)。抽象方法是在父类中声明但没有具体实现的方法。子类必须实现该抽象方法才能被实例化。使用装饰器,可以将方法标记为抽象方法。抽象方法在父类中声明时没有提供具体的实现,只有方法名和参数列表。而子类必须提供具体实现以满足父类中的抽象方法要求。以下是一个示例,展示如何使用。

知智 6948

微带天线理论学习笔记(1)

微带天线的概念是由Deschamps于1953年提出来的,它是在一块厚度远小于工作波长的介质基片的一面敷以金属辐射片、一面全部敷以金属薄层作接地板而成。辐射片可以根据不同的要求设计成各种形状。微带天线具有质量轻、体积小和易于制造等优点,广泛应用于个人无线通信中。

qq_36521926的博客 6227

Python装饰器使用方法详解

当涉及到处理有返回值的函数时,对于内部函数我们应该使用一个变量将函数的运行结果保存起来,并放在内层函数的return中。装饰器可以改变被装饰函数的行为,或者在调用被装饰函数之前和之后增加额外的操作。装饰器的语法是使用 @ 语法符,在函数定义之前增加装饰器函数的名称。函数中,我们增加了形参的输入,因此,在装饰器中,也要为之做出更改。权限控制:装饰器可以用来实现函数级别的权限控制,只允许特定的用户访问特定的函数。装饰器可以让你在函数或类的定义中添加额外的逻辑,而不更改它们的实现。在代码中,我们建立了一个名为。

Hello Word 4251

保姆级教程:用Wireshark抓包分析10M汽车以太网PLCA轮询机制(附pcap文件)

本文详细介绍了10M汽车以太网PLCA轮询机制的抓包分析与性能优化方法。通过Wireshark实战教程,解析PLCA协议的时分多址特性、总线型拓扑结构及带宽优化策略,帮助工程师提升车内网络的可靠性和实时性。附赠pcap文件供实践参考。

wdx01234567的博客 240

方差分解分析变量筛选与显著性计算

冗余分析(redundancy analysis,RDA)是一种回归分析结合主成分分析的排序方法,也是多响应变量(multiresponse)回归分析的拓展。在进行VPA时,首先就要对这些环境因子进行一个分类,然后在约束其它类环境因子的情况下,对某一类环境因子进行排序分析,这种分析也成为偏分析,即partialRDA。在地球环境科学的实际应用中,可以基于VPA结果得出不同类型的环境因素(如何气候、土壤性质以及植物)对生物群落组成(如植被丰度,微生物群落)的解释程度。对于由或创建的排序对象,函数。

wlh2067的博客 2521

Python中如何使用类装饰器来修改类的行为?

类装饰器是Python中一种强大的工具,用于在不修改原始类定义的情况下,动态地修改或增强类的行为。通过定义一个类,并在该类中实现__call__方法,可以实现对类的修改。类装饰器可以用于添加新方法、修改现有方法、自动添加属性、访问控制和数据验证等多种场景。使用类装饰器可以使代码更加简洁、灵活和可维护。18。

wang15510689957的博客 482

避坑指南:Cursor AI生成Flutter代码时最容易翻车的5个配置细节

本文深入剖析了使用Cursor AI生成Flutter代码时,因.cursorrules配置文件不当而导致的五大常见问题。重点探讨了如何通过制定清晰、具体的规则,避免状态管理混乱、设计图输入低效、项目架构脱节、性能隐患及规则维护缺失等陷阱,从而将AI转化为高效、可靠的开发伙伴,提升代码质量和团队协作效率。

wdx0123456的博客 415

python装饰器的使用方法

装饰器在 python 中使用的频率非常高,它可以在不改动原有函数的基础上对其进行增强功能。下面主要是介绍装饰器的各种用法,并理解其运行过程。装饰器的用法很多,封装成库,给其他人使用也非常的方便,我们需要理解它的运行过程,才能更好的使用它。

Crazy博客 5472

Halcon实例转OpenCVSharp--粘连物体分割与计数(基于距离变换+分水岭算法) (附源码)

本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp应用实例--粘连物体分割与计数(基于距离变换+分水岭算法)! 本文使用的OpenCVSharp版本---》v4.5.3。 实现目标:将下图中的硬币分割出来并计算数量。 预期效果图: ...

Color Space的博客 2421

【产品经理修炼之道】- 优惠券系统从入门到精通(二)

在电商平台中,优惠券的使用场景与频次都很高。那么如何做好一个优惠券系统呢?本文总结了相关流程和设计思路,希望对你有所帮助。上一篇与大家分享了架构中的前端应用、生命周期、优惠券管理中OpenAPI 、基础系统,今天继续与大家分享架构图中优惠券模板部分。

xiaoli8748的专栏 1292

python 类的使用(5)之类装饰器(类的装饰器和类作为装饰器)

python 类的使用(5)之类装饰器(类的装饰器和类作为装饰器)

发呆的比目鱼的博客 2304

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python高级技巧:装饰器全面指南,从基础到高级应用

装饰器本质上是一种特殊的嵌套函数,它接收一个函数作为参数(被装饰的函数),并返回一个新的函数(装饰后的函数)。装饰器的最大价值在于不修改原函数代码的情况下,为函数添加新功能。# 一个简单的装饰器示例def decorator(func): # 接收一个函数作为参数def wrapper(): # 定义一个新函数func() # 调用原函数return wrapper # 返回新函数")# 手动装饰# 输出:# Hello!

2302_77468438的博客 598

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python装饰器原理与高级应用实战指南

装饰器是Python中实现AOP(面向切面编程)的核心技术,通过高阶函数实现代码复用和功能扩展。其本质是接受函数作为输入并返回新函数的可调用对象,遵循开放封闭原则实现功能增强而不修改原代码。在工程实践中,装饰器广泛应用于性能监控(如执行时间统计)、缓存优化(如lru_cache)、权限控制等横切关注点场景。Python内置的@property、@classmethod等装饰器展示了其语言级集成优势,而Flask、Django等主流框架则将其用于路由注册和权限验证。理解闭包和作用域规则是掌握装饰器的关键,同时

weixin_34406086的博客 379

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

{%coding:Python%}探索Python的装饰器从基础到高级应用的全面指南

``pythonfrom functools import wrapsdef preserving_decorator(func): @wraps(func) def wrapper(args, kwargs): 包装函数的文档字符串 print(准备执行函数...) return func(args, kwargs) return wrapper```装饰器的本质是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。

xxh2jd的博客 307

Python装饰器终极指南:从基础到高级应用的完整教程

Python装饰器是一种强大而灵活的工具,它允许你在不修改原函数代码的情况下增强函数功能。本教程将带你从基础概念逐步深入到高级应用,掌握装饰器的核心原理和实用技巧,让你的Python代码更加优雅和高效。 ## 什么是Python装饰器? 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码修改的前提下增加额外功能。装饰器的返回值也是一个函数对象,它经常用于有切面需求的场景,比

gitblog_00182的博客 377

Python装饰器完整指南:从基础语法到高级应用的终极教程

Python装饰器是Python编程中最强大且优雅的特性之一,它允许你以简洁、可重用的方式修改或增强函数和类的行为。无论你是Python新手还是经验丰富的开发者,掌握装饰器都能显著提升你的代码质量和开发效率。本教程将带你从装饰器的基础概念到高级应用,全面掌握这一核心技能。 ## 什么是Python装饰器?🎯 装饰器本质上是一个函数,它接受另一个函数作为参数,并返回一个新的包装函数。这种机制让

gitblog_00128的博客 924

Python装饰器终极指南:从零基础到高级应用的完整教程

Python装饰器是Python编程中一种强大而灵活的功能,它允许开发者在不修改原函数代码的情况下,为函数添加额外的功能。本教程将从基础概念开始,逐步深入到高级应用,帮助你全面掌握Python装饰器的使用方法和技巧。 ## 什么是Python装饰器 装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更 Py

gitblog_00885的博客 460

装饰器与递归:Python函数高级应用实战指南

在Python中,函数是一等公民,可作为参数传递或返回值,这为闭包与装饰器提供了底层基础。装饰器通过接收函数并返回新函数,在不修改业务代码的前提下实现日志、缓存、重试等横切关注点;递归则通过将复杂问题拆解为可收敛的子问题来简化代码,但朴素递归常因重复计算和调用深度限制而性能不佳。将装饰器与递归结合,记忆化缓存能把指数级调用拉回线性复杂度,深度守卫与轨迹追踪则显著提升可调试性与健壮性。这套组合在动态规划、树形遍历、算法注册表等场景中具有广泛工程价值。掌握装饰器与递归的协作方式,有助于写出职责清晰、复用度高且边

weixin_33491377的博客 216

Python函数装饰器:日志记录与性能计时完整指南

Python装饰器是Python编程中一个强大而优雅的特性,它允许我们在不修改原函数代码的情况下,为函数添加额外的功能。在python-mastery项目中,我们可以学习到如何实现专业的日志记录和性能计时装饰器。🎯 ## 什么是Python装饰器? Python装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。通过使用@符号,我们可以轻松地将装饰器应用到目标函数上,实现代码

gitblog_00741的博客 1035

031 Python语法之装饰器

装饰器 装饰器格式 def costTime(func): import time startTime = time.time() func() endTime = time.time() print("一共用了", endTime-startTime, "秒") def func() sum1 = 0 for i in range(100...

runnoob_1115的博客 191

装饰器-python

【转载】:理解 Python 装饰器看这一篇就够了 【转载】:简单聊聊Python中的wraps修饰器 1) # 1) 【简单装饰器】use_logging 就是一个装饰器,它一个普通的函数,它把执行真正业务逻辑的函数 func 包裹在其中,看起来像 foo 被 use_logging 装饰了一样 def use_logging(func): def wrapper(): ...

sinat_15355869的博客 392
上一篇: Python 上下文管理器高级应用指南
下一篇: Python 生成器和迭代器高级应用指南
第一程序员
博客等级 码龄1年 1万+粉丝 1822原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值