python 装饰器

需要先理解闭包函数

1. 统计 index函数的执行时间

import  time

def index():
    time.sleep(2)
    print('welcome to index')

 

第一种方式 

  计算函数开始时间,结束时间

start_time = time.time()
index()
end_time = time.time()
print(end_time - start_time)

 

此种方式缺点:

  ① 只能统计index()函数的执行时间,统计其他函数执行时间需要再写一次统计逻辑

第二种方式

  第一种方式进阶(解决只能统计固定函数执行时间的缺点)

def timmer(func):
    start_time = time.time()
    func()  # index()
    end_time = time.time()
    print(end_time - start_time)

timmer(index)

   定义timmer函数,将需要统计执行时间的函数作为timmer参数传入

   此种方式缺点:改变了index函数的调用方式

第三种方式

  闭包函数方式

def timmer(func):
    def inner():
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time - start_time)
    return inner

index = timmer(index)
index()    #inner()

 继续进阶 优化第三种方式

import  time

def timmer(func):
    def inner():
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time - start_time)
    return inner

@timmer    
#index = timmer(index) #python解释器遇到@符号,
# 就会把其下方函数当做参数传给timmer(index)
def index():
    time.sleep(2)
    print('welcome to index')


index()    #inner()

 ↑ 当index函数有返回值时无法获取

@timmer
def index(): time.sleep(2) print('welcome to index') return 1111

res = index() #获取的是inner函数的返回值,而此时inner没有返回值
print(res)

 修改inner函数接收返回值

import  time

def timmer(func):
    def inner():
        start_time = time.time()
        res = func()         #修改
        end_time = time.time()
        print(end_time - start_time)
        return res           #修改
    return inner

@timmer
def index():
    time.sleep(2)
    print('welcome to index')
    return 1111


res = index()    #inner()
print(res)

 index函数会有参数,继续修改

 

import  time

def timmer(func):
    def inner(*args,**kwargs):              #修改点    将接收到的参数传给func
        start_time = time.time()
        res = func(*args,**kwargs)        #修改点
        end_time = time.time()
        print(end_time - start_time)
        return res
    return inner

@timmer
def index(name):
    time.sleep(2)
    print('welcome %s to index' % name)
    return 1111

res = index('xiaoming')    #inner('xiaoming')
print(res)

 

 以上,便实现了一个无参装饰器

 

posted @ 2018-10-28 20:43  漂泊的蒲公英  阅读(102)  评论(0)    收藏  举报