Python 装饰器高级应用指南

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

Python 装饰器高级应用指南

1. 装饰器基础

装饰器是 Python 中一种强大的特性,它允许我们在不修改原函数代码的情况下,增强函数的功能。

def decorator(func):
    def wrapper(*args, **kwargs):
        print("Before function call")
        result = func(*args, **kwargs)
        print("After function call")
        return result
    return wrapper

@decorator
def greet(name):
    print(f"Hello, {name}!")

# 调用被装饰的函数
greet("Alice")

2. 带参数的装饰器

2.1 基本带参装饰器

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

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

greet("Alice")

2.2 装饰器类

class Timer:
    def __init__(self, unit="seconds"):
        self.unit = unit
    
    def __call__(self, func):
        def wrapper(*args, **kwargs):
            import time
            start = time.time()
            result = func(*args, **kwargs)
            end = time.time()
            duration = end - start
            if self.unit == "milliseconds":
                duration *= 1000
            print(f"Function {func.__name__} took {duration:.2f} {self.unit}")
            return result
        return wrapper

@Timer(unit="milliseconds")
def slow_function():
    import time
    time.sleep(1)
    print("Function executed")

slow_function()

3. 高级装饰器技巧

3.1 保留函数元数据

使用 functools.wraps 可以保留被装饰函数的元数据。

import functools

def 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

@decorator
def greet(name):
    """Greet someone"""
    print(f"Hello, {name}!")

print(greet.__name__)  # 输出: greet
print(greet.__doc__)   # 输出: Greet someone

3.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 greet(name):
    print(f"Hello, {name}!")

greet("Alice")
# 输出顺序:
# Decorator 1 before
# Decorator 2 before
# Hello, Alice!
# Decorator 2 after
# Decorator 1 after

3.3 装饰器工厂

装饰器工厂是一个函数,它返回一个装饰器。

def create_decorator(prefix):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"{prefix}: Before function call")
            result = func(*args, **kwargs)
            print(f"{prefix}: After function call")
            return result
        return wrapper
    return decorator

@create_decorator("DEBUG")
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

4. 实际应用场景

4.1 日志记录

import functools
import logging

logging.basicConfig(level=logging.INFO)

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

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

result = add(1, 2)
print(result)

4.2 缓存

import functools

def cache(func):
    cache_dict = {}
    
    @functools.wraps(func)
    def wrapper(*args):
        if args in cache_dict:
            return cache_dict[args]
        result = func(*args)
        cache_dict[args] = result
        return result
    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.3 权限验证

import functools

def requires_permission(permission):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            # 假设 current_user 是当前登录用户
            current_user = {"permissions": ["read", "write"]}
            if permission not in current_user["permissions"]:
                raise PermissionError(f"User does not have {permission} permission")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@requires_permission("write")
def create_post(title, content):
    print(f"Creating post: {title}")
    return {"title": title, "content": content}

@requires_permission("admin")
def delete_post(post_id):
    print(f"Deleting post: {post_id}")
    return True

create_post("Hello", "World")  # 成功
# delete_post(1)  # 抛出 PermissionError

4.4 性能分析

import functools
import time

def performance(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

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

slow_function()

5. 最佳实践

  1. 使用 functools.wraps:保留被装饰函数的元数据,如函数名、文档字符串等。
  2. 保持装饰器简单:装饰器应该专注于单一功能,避免过于复杂。
  3. 使用参数化装饰器:对于需要配置的装饰器,使用参数化装饰器可以提高灵活性。
  4. 注意装饰器的执行顺序:当使用多个装饰器时,注意它们的执行顺序。
  5. 测试装饰器:确保装饰器在各种情况下都能正常工作。
  6. 文档化装饰器:为装饰器添加文档字符串,说明其功能和用法。
  7. 避免修改函数签名:装饰器应该保持函数的签名不变。

6. 总结

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

在实际应用中,装饰器可以用于日志记录、缓存、权限验证、性能分析等多种场景,大大提高代码的复用性和可维护性。

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

[Python]:热血传奇-Wzl,Wzx的解析 首先我们要了解,wzl与wzx的对应关系,wzx里面存的是每张二进制图片数据在wzl中的偏移量,所以取到wzx中的偏移数据就可以取到wzl每张图片数据,其实就这么简单。结构体为 [Byte][Byte][Byte][Byte][short][short][short][short][int]-读取44至48字节代表为,[wzx中偏移值总数量] [int类型] [4字节]-根据在wzx中取得的偏移值总数量,每张图片偏移值在wzl中取图片数据。2.[取wzl中图片偏据]:根据wzx中取得数据对[ 阅读详情

相关推荐

海康VM加密狗无法识别常见问题排查

海康VM加密狗无法识别常见问题排查

视觉人机器视觉的博客 2730

Python装饰器的高级用法:动态装饰器与参数传递

Python装饰器是提升代码可重用性和可读性的强大工具,广泛应用于函数和类的增强。然而,随着项目规模的扩大和需求的复杂化,基础装饰器的功能已难以满足开发者的需求。本文深入探讨了Python装饰器的高级用法,重点介绍了动态装饰器的创建与应用、装饰器参数的传递机制,以及如何在运行时动态修改被装饰函数的行为。通过详细的数学公式解释、丰富的代码示例和全面的中文注释,本文旨在帮助开发者全面掌握装饰器的高级特性,提升代码的灵活性和维护性。文章还涵盖了装饰器在实际项目中的应用场景,展示了其在日志记录、权限控制、性能监测等

一个被知识诅咒的人 1981

实战对比:VINS和ORBSLAM3在无人机避障中的表现(含实测数据)

本文通过实战测试,深度对比了VINS和ORBSLAM3两种主流视觉SLAM算法在无人机避障中的表现。测试聚焦于光照变化、动态遮挡和快速运动三大挑战,提供了详细的实测数据与性能分析。结果表明,VINS在计算效率和实时性上占优,而ORBSLAM3在定位精度和地图管理方面更稳健,为不同应用场景下的工程选型提供了清晰依据。

醉三国 628

Python 装饰器高级应用详解:从原理到实践

装饰器是 Python 中一种强大的元编程工具,它允许我们在不修改原函数代码的情况下增强函数的功能。装饰器在 Python 中被广泛应用于日志记录、性能分析、权限控制、缓存等场景。@property。

lady_mumu的博客 4852

ios生成海报使用dom-to-image中toPng报错isTrusted:true

主要是ios中safari浏览器解析错误,引起的报错,主要引起原因toPng会调用toSvg,toSvg直接将html标签内容通过svg中foreignObject标签直接包裹,然后转base64, 通过data:image/svg+xml;解决办法:二次生成(调用两次),判断ios or 安卓,生成第一次生成,不用参数,例如:scale: 3,在第二次生成再进行清晰度操作,避免多次生成,引起性能消耗。以上种种很多案例,使用canvase进行转换的,标签丢失,直接toPng版本的,兼容性问题。

weixin_44601570的博客 2106

2025年度工业级3D全景相机技术解析选型参考:国产品牌的技术突围与市场格局

本文分析了工业级3D相机在智慧城市和建筑数字化中的应用。通过对比国内外主流设备的技术参数和应用场景,发现国产品牌如众趣科技在性价比和本地化服务方面具有优势,尤其适合大型空间扫描项目;而国际品牌如Faro、Leica则在精度和可靠性上保持领先。建议根据项目需求(如测距范围、精度要求、预算)进行设备选型,综合考虑扫描效率、数据处理能力和系统兼容性。国产品牌已在国内大型基建项目中展现出竞争力,国际品牌则更适合高精度逆向工程和国际化项目。

gxdtgsy的博客 1075

六、Python高级——装饰器及使用场景

Python高级内容 闭包 1.闭包的基本的定义 ​ 使用外部函数变量的内部函数叫做闭包 2.闭包外部函数 闭包可以保存外部函数内的变量,不会随着外部函数的调用完而销毁,故也会导致外部函数的变量没有及时释放,存在消耗内存的现象发生 3.修改闭包内使用的外部变量 #闭包实例: def set_fun(func): def call_fun(): print("参数值:", func) return call_fun #外层函数的执行返回一个内层函数的引用 fun = set_f

weixin_46190208的博客 449

神经算子:突破科学计算瓶颈的函数空间映射技术

神经算子(Neural Operators)是深度学习在科学计算领域的重要突破,它从根本上改变了处理连续物理问题的方式。与传统神经网络学习离散数据点映射不同,神经算子学习的是函数空间到函数空间的映射,这种范式转换使其具备离散化收敛性和超分辨率预测能力。在计算流体力学、天气预报等需要求解偏微分方程的场景中,神经算子能够在保持精度的同时将计算速度提升数个数量级。傅里叶神经算子(FNO)通过快速傅里叶变换实现高效计算,特别适合规则网格问题;而图神经算子(GNO)则擅长处理不规则网格和复杂几何形状。这种技术为参数敏

cuililai5127的博客 446

Python装饰器以及高级用法!

介绍 首先我要承认,装饰器非常难!你在本教程中看到的一些代码将会有一些复杂。大多数人在学习Python时都跟装饰器做过斗争,所以如果这对你来说很奇怪,不要感到沮丧,因为同样的大多数人都可以克服这种苦难。在本教程中,我将逐步介绍了解装饰器的过程。首先我假设你已经可以编写基本函数和基本类。如果你不能做这些事,那么我建议你在回到这里之前先学习如何去做到编写基本函数和基...

Pythoncxy的博客 974

n8n 快速入门1:构建一个简单的工作流

n8n 快速入门指南

engchina的专栏 1万+

【PointNet++】使用Open3D对分割后的结果可视化

PointNet++中的局部分割网络预测后是没有可视化文件的,所以需要自己通过编写Open3D或者PCL点云算法去可视化,在本人经过查找翻阅修改后,实现了网络输出点云分割后结果的可视化。已实现推测单个点云,并可视化。

纵马踏花向自由 2455

Python高级语法-装饰器(Python语法糖)

Python装饰器

周先森爱吃素的博客 9909

SAP PI 系统复制,不只是把数据库拷过去,而是一次集成拓扑的重新落位

文章摘要:SAP PI/PO系统刷新生产数据到测试环境时,标准系统复制无法自动处理集成中枢特有的环境绑定问题。系统复制后,PI仍保留生产环境的连接配置,可能导致测试系统向生产环境发送消息。SAP提供的CTC模板可自动化部分后续配置,但无法替代人工对接口风险的全面评估。关键在于系统复制前绘制接口风险地图,复制后进行分层次验证:禁用生产连接、重定向测试接口、复核安全配置,并通过代表性链路测试确保系统行为符合预期。这需要结合SAP标准流程与业务语义判断,形成完整的治理闭环。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 85

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

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

2302_77468438的博客 598

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

weixin_34406086的博客 379

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

{%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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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
上一篇: Rust 模块系统高级应用指南
下一篇: Rust 错误处理高级应用指南
第一程序员
博客等级 码龄1年 1万+粉丝 1822原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值