装饰器一(理解):

1、函数
2、装饰器,作用;修饰别的函数,给其他函数附加新的功能
原则:
1、不能修改被装饰函数的源码
2、不能改百年被装饰函数的调用方式
应用场景:
插入日志、性能测试、处理事务
理解:
1、函数即变量---也可以作为参数/返回值
2、高阶函数---以函数作为参数/返回值的函数
3、函数嵌套---函数里面定义函数
装饰器 = 高阶函数 + 嵌套函数

import time

# 1、函数--两数相加
def add(x,y):
    res = x+y
    return res

add1 = add         #函数即变量
print("函数即变量,add1 = ",add1(1,3))

print("add()值=%s" %(add(add1(1,1),1)))    #参数

# 2、装饰器---测试一个函数运行时间

# 被装饰函数
def f():
    print("i am f")
    time.sleep(1)

#运行时间
def new_f():
    start_time = time.time()    #开始时间
    f()                            #执行函数
    end_time = time.time()        #结束时间
    print("耗时%s秒" % (end_time - start_time))

# 执行
new_f()

# 改为装饰器格式
def my_time(func):                #参数 func 是一个函数
    start_time = time.time()    #开始时间
    func()                        #执行函数
    end_time = time.time()        #结束时间
    print("函数%s耗时%s秒" % (func.__name__,end_time - start_time)) #func.__name__是函数名,传入的参数
my_time(f)

# 装饰器

def my_time1(func):
    def warpper():        
        start_time = time.time()    
        func()                       
        end_time = time.time()       
        print("函数%s耗时%s秒" % (func.__name__,end_time - start_time))
    return warpper  #带括号 返回的是函数值,不带括号返回的是函数

n = my_time1(f)  # n是函数my_time1()的返回值,该返回值是函数warpper本身 ==
f = n
print("直接执行被装饰函数,就可以执行装饰器")
f()



def my_time2(func):
    def warpper():        
        start_time = time.time()    
        func()                       
        end_time = time.time()       
        print("函数%s耗时%s秒" % (func.__name__,end_time - start_time))
    return warpper  #带括号 返回的是函数值,不带括号返回的是函数

@my_time2#---简化了步骤  f_my_time2 = my_time2(f_my_time2)
def f_my_time2():
    print("i am f_my_time2")
    time.sleep(3)
f_my_time2()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容