装饰器一(理解):

2018-05-16  本文已影响0人  在努力中

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()

上一篇 下一篇

猜你喜欢

热点阅读