10-3 函数装饰器

装饰器形成的过程

  最简单的装饰器----有返回值的----有一个参数----万能参数装饰器的作用:


不想修改函数的调用方式,但是还想再原来的函数前后添加功能#原则:开放封闭原则
开放: 对扩展是开放的
封闭: 对修改是封闭的
语法糖:@装饰器函数名,@timmer等价于func = timmer(func),其中func()是被装饰函数,timmer()就是装饰器函数

最简单的装饰器

import time
def timmer(f):
    start = time.time()
    f()
    end = time.time()
    print(end-start)
def func():
    time.sleep(0.1)
    print('nice!')
timmer(func)

装饰有返回值的装饰器

import time
#timmer()就是装饰器函数,只是对一个函数有装饰作用
def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
    def inner():
        start = time.time()
        ret = f()      #被装饰的函数
        end = time.time()
        print(end-start)
        return ret
    return inner

@timmer     #语法糖---@装饰器函数名,等价于func = timmer(func)
def func():     #    被装饰的函数
    time.sleep(0.1)
    print('nice!')
    return 'summertrain'
# func = timmer(func)
result = func()
print(result)

有一个参数

import time
#timmer()就是装饰器函数
def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
    def inner(a):
        start = time.time()
        ret = f(a)      #被装饰的函数
        end = time.time()
        print(end-start)
        return ret
    return inner

@timmer     #语法糖---@装饰器函数名,等价于func = timmer(func)
def func(a):     #    被装饰的函数
    time.sleep(0.1)
    print('nice!',a)
    return 'summertrain'
# func = timmer(func)
result = func(1)
print(result)

万能参数

#装饰带多个参数,且包括按照位置以及参数传参的装饰器
import time
#timmer()就是装饰器函数
def timmer(f):#通过此闭包函数返回一个内部函数名,然后在外部接收,让接收的函数名与外部函数名保持一致即可
    def inner(*args,**kwargs):
        start = time.time()
        ret = f(*args,**kwargs)      #被装饰的函数
        end = time.time()
        print(end-start)
        return ret
    return inner

@timmer     #语法糖---@装饰器函数名,等价于func = timmer(func)
def func(a,b):     #    被装饰的函数
    time.sleep(0.1)
    print('nice!',a,b)
    return 'summertrain'
# func = timmer(func)
result = func(1,b=22)
print(result)

装饰器的固定模式

#例子
import time
def wrapper(f):     #   f是被装饰的函数
    def inner(*args,**kwargs):
        '''在被装饰函数之前要做的事儿'''
        ret = f(*args,**kwargs)
        '''在被装饰函数之前要后的事儿'''
        return ret
    return inner

@wrapper
def func(a,b):
    time.sleep(0.1)
    print('nice!',a,b)
    return 'summertrain'



#减缩版
def wapper(func):
    def inner(*args,**kwargs):
        ret = func(*args,**kwargs)
        return ret
    return inner
@wapper
#qqxing = wapper(qqxing)
def qqxing():
    print(1111)
result = qqxing()

装饰器进阶

def wahaha():
    print('李白')
print(wahaha,type(wahaha))  #   结果:<function wahaha at 0x00588B70> <class 'function'>
#查看字符串格式的函数名
print(wahaha.__name__,type(wahaha.__name__))    #   结果:wahaha <class 'str'>
from functools import wraps
def wrapper(f):#f=holiday
    @wraps(f)
    def inner(*args,**kwargs):
        print('before')
        ret = f(*args,**kwargs)
        print('later')
        return ret
    return inner
@wrapper
def holiday(day):
    '''放假通知'''
    print('国庆%s天假期'%day)
    return '开心'
print(holiday.__doc__)
print(holiday.__name__)
result = holiday(7)
print(result)

执行结果:

放假通知
holiday
before
国庆7天假期
later
开心

原文地址:https://www.cnblogs.com/Cheryol/p/9740436.html