【简明】彻底搞清楚Python的装饰器 | Python 主题月

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【简明】彻底搞清楚Python的装饰器 | Python 主题月

什么是装饰器


“闭包”是什么?,我们可以认为装饰器就是一个闭包函数,同时它也返回了一个函数。


你也可以认为装饰器就是将函数作为参数传递到方法中,进行加工,再返回出来。


装饰器的使用场景


1、附加功能(统一日志格式,定时器)

2、数据的清理和添加(注入类似动态token的数据,修改清理内部数据)

3、函数注册等


装饰器的demo


1、实现函数在执行前后所花费的时间

装饰器的使用格式:@decorator


# 定义装饰器
import time
def execTime(func):
    def inner(*args,**kwargs):    # 接收参数
        time1 = time.time()
        res = func(*args,**kwargs)
        time2 = time.time()
        print(func.__name__,'执行花费',time2-time1,'s')
        return res    # 返回func的返回值
    return inner  # 返回inner方法对象
# 在execAdd方法上使用execTime装饰器
@execTime
def execAdd(a,b):
    time.sleep(1)
    return a+b
# 调用execAdd
res = execAdd(1,2)
print(res)
复制代码


运行结果:


python3 test.py
execAdd 执行花费 1.0000572204589844 s
3
复制代码


2、实现日志的统一打印


import time,logging
def execTime(func):
    def inner(*args,**kwargs):
        time1 = time.time()
        # 添加方法开始的日志
        logging.warning('now func {} start...'.format(func.__name__))
        res = func(*args,**kwargs)
        # 添加方法结束的日志
        logging.warning('now func {} finished...'.format(func.__name__))
        time2 = time.time()
        print(func.__name__,'执行花费',time2-time1,'s','\n')
        return res
    return inner
@execTime
def execAdd(a,b):
    time.sleep(1)
    return a+b
@execTime
def sayHi(name):
    print('hello,{}.'.format(name))
sayHi('phyger')
res = execAdd(1,2)
print(res)
复制代码


输出


python3 test.py
WARNING:root:now func sayHi start...
hello,phyger.
WARNING:root:now func sayHi finished...
sayHi 执行花费 0.00700068473815918 s
WARNING:root:now func execAdd start...
WARNING:root:now func execAdd finished...
execAdd 执行花费 1.0020573139190674 s
3
复制代码


你会看到上面的两个方法在执行前后都会被增加开始和结束的告警日志,而且会统计方法的执行时间,通过这种方式我们可以方便快捷的对方法进行封装。


注意


当我们执行以下代码时:


@execTime
def sayHi(name):
    print('hello,{}.'.format(name))
复制代码


输出


python3 test.py
WARNING:root:now func sayHi start...
hello,phyger.
WARNING:root:now func sayHi finished...
sayHi 执行花费 0.018001317977905273 s
inner
复制代码


sayHi方法的name竟然是装饰器的内函数的方法,这不是我们的期望结果啊。我们方法的name和注释被装饰器内函数重写了,我们怎么解决这个问题呢?


Python帮我提供了一个函数来解决这个问题,他就是functools.wraps。


我们重写装饰器来看看效果:


from functools import wraps
import time,logging
def execTime(func):
    @wraps(func)
    def inner(*args,**kwargs):
        time1 = time.time()
        logging.warning('now func {} start...'.format(func.__name__))
        res = func(*args,**kwargs)
        logging.warning('now func {} finished...'.format(func.__name__))
        time2 = time.time()
        print(func.__name__,'执行花费',time2-time1,'s','\n')
        return res
    return inner
# 调用
sayHi('phyger')
print(sayHi.__name__)
复制代码


输出


test.py
WARNING:root:now func sayHi start...
hello,phyger.
WARNING:root:now func sayHi finished...
sayHi 执行花费 0.003000020980834961 s
sayHi
复制代码


你能看到,使用了装饰器的sayHi方法的__name__值已经是它自身的值了。


如果你想在当前装饰器的基础上再增加功能,那么你可能需要使用类装饰器,因为类的继承特性可以很好的解决你这个需求。关于类装饰器我们后面再介绍。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
3
分享
相关文章
|
22天前
|
掌握Python装饰器:轻松统计函数执行时间
掌握Python装饰器:轻松统计函数执行时间
157 76
掌握 Python 文件处理、并行处理和装饰器
本文介绍了 Python 在文件处理、并行处理以及高级功能(如装饰器、Lambda 函数和推导式)的应用。第一部分讲解了文件的基本操作、读写方法及处理大型文件的技巧,并演示了使用 Pandas 处理结构化数据的方式。第二部分探讨了多线程与多进程的并行处理,以及 `concurrent.futures` 模块的简化用法,适合不同类型的任务需求。第三部分则深入装饰器的实现与应用,包括简单装饰器、带参数的装饰器及 `functools.wraps` 的使用,同时简要介绍了 Lambda 函数和推导式的语法与场景。内容实用且全面,帮助读者掌握 Python 高效编程的核心技能。
探索Python中的装饰器:从基础到高级应用
装饰器在Python中是一个强大且令人兴奋的功能,它允许开发者在不修改原有函数代码的前提下增加额外的功能。本文将通过具体代码示例,带领读者从装饰器的基础概念入手,逐步深入到高级用法,如带参数的装饰器和装饰器嵌套等。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
106 6
探索Python中的装饰器:从基础到高级应用
本文将带你深入了解Python中的装饰器,这一强大而灵活的工具。我们将一起探讨装饰器的基本概念,它们如何工作,以及如何使用它们来增强函数和类的功能,同时不改变其核心逻辑。通过具体代码示例,我们将展示装饰器的创建和使用,并探索一些高级应用,比如装饰器堆栈和装饰带参数的装饰器。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角,帮助你更有效地使用装饰器来简化和优化你的代码。
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
183 61
Python装饰器实战:打造高效性能计时工具
Python装饰器是什么?
装饰器是Python中用于动态修改函数、方法或类功能的工具,无需改变原代码。通过将函数作为参数传递并返回新函数,装饰器可以在原函数执行前后添加额外逻辑。例如,使用`@logger`装饰器可以打印函数调用日志,而`@timethis`则可用于计算函数执行时间。为了保持被装饰函数的元信息(如`__name__`和`__doc__`),可使用`functools.wraps`装饰器。此外,带参数的装饰器可通过嵌套函数实现,如`@timeitS(2)`,以根据参数条件输出特定信息。
132 59
深入理解Python中的装饰器
本文旨在通过具体实例和详细解释,帮助读者深入理解Python中装饰器的工作原理及其在实际开发中的应用。我们将从装饰器的基本概念开始,逐步深入到其高级用法,包括自定义装饰器、带参数的装饰器以及类装饰器等。通过本文的学习,读者将能够掌握装饰器的核心思想,提高代码的可读性和可维护性。
python装饰器底层原理
Python装饰器是一个强大的工具,可以在不修改原始函数代码的情况下,动态地增加功能。理解装饰器的底层原理,包括函数是对象、闭包和高阶函数,可以帮助我们更好地使用和编写装饰器。无论是用于日志记录、权限验证还是缓存,装饰器都可以显著提高代码的可维护性和复用性。
90 5
|
7月前
|
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
96 11

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问