python-装饰器的最终形态和固定格式 语法糖


import time
def timer(f):   #  这是一个装饰器函数
    def inner():
        start = time.time()
        f()     # 被装饰的函数
        end = time.time()
        print('函数执行了%d秒' %(end-start) )
    return inner
@timer      # 语法糖  @装饰器函数名
def func(): # 被装饰的函数
    time.sleep(3)
    print('这是一个函数执行的内容')
func() 

 

装饰带参数函数的装饰器

import time
def timer(f):   #  这是一个装饰器函数
    def inner(*args,**kwargs):
        start = time.time()
        ret = f(*args,**kwargs)     # *args,表示打散元组中每个元素传递
        end = time.time()
        print('函数执行了%s秒' %(end-start) )
        return ret
    return inner
# 两个参数传递,按位置传递参数方式 *args就可以解决
@timer      # 语法糖  @装饰器函数名
def func(a,b): # 被装饰的函数
    time.sleep(0.02)
    print('同志们',a,b)
    return '新年好'

# 一个位置参数,*args就能传递
@timer      # 语法糖  @装饰器函数名
def func1(a): # 被装饰的函数
    time.sleep(0.02)
    print('同志们',a)
    return '新年好'

# 如果赋值传递则需要**kwargs来解决
@timer      # 语法糖  @装饰器函数名
def func2(a,b=2): # 被装饰的函数
    time.sleep(0.02)
    print('同志们',a,b)
    return '新年好'

ret = func(1,2)
ret1 = func1(1)
ret2 = func2(1)
print(ret,ret1,ret2) 

 

装饰器的固定格式

def wrapper(f):   #  这是一个装饰器函数
    def inner(*args,**kwargs):
        ret = f(*args,**kwargs)     # *args,**kwargs表示打散元组中每个元素传递
        return ret
    return inner
@wrapper
def func(a,b): # 被装饰的函数,可以传递参数
    print('这是函数主体',a,b)

ret = func(1,2) # 这里执行的是inner

 

 

 

 

posted @ 2018-10-02 17:08  张志飞  阅读(416)  评论(0)    收藏  举报