python装饰器的认识

装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

 

传参和返回值都是函数

 

用的语法糖形式,比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name等都是python中的装饰器。

写法: 1. 要额外增加的功能函数单独写; 2. 在调用装饰器的地方使用@***的写法,此时会把这个函数或方法传入到装饰器中进行使用;

3. 当有多个装饰器时,从内向外开始执行; 4. 装饰器需要传参时,需要再多嵌套一层

# 为函数添加一个统计运行时长的功能
import time
import threading
 
def how_much_time(func):
    def inner():
        t_start = time.time()
        func()
        t_end = time.time()
        print("一共花费了{0}秒时间".format(t_end - t_start, ))
 
    return inner
 
 
@how_much_time
# @how_much_time等价于sleep_5s = how_much_time(sleep_5s)
def sleep_5s():
    time.sleep(5)
    print("%d秒结束了" % (5,))
 
@how_much_time
def sleep_6s():
    time.sleep(6)
    print("%d秒结束了" % (6,))
 
t1 = threading.Thread(target=sleep_5s)
t2 = threading.Thread(target=sleep_6s)
t1.start()
t2.start()
 

  

 

@wrap()语法糖:因为装饰器实质是就是一个函数,是一个被修饰过函数,他与原来未被修饰的函数是两个不同的函数对象。

所以,这个装饰器丢失了原来函数对象的一些属性,比如:__name__,__doc__等属性。使用wraps语法糖可以保留这些属性。

 

 

 

链接:(33条消息) python装饰器详解_谦虚且进步的博客-CSDN博客

posted @ 2023-03-15 15:25  Aedline  阅读(15)  评论(0编辑  收藏  举报