10-3 函数装饰器

Posted cheryol

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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     #语法糖[email protected]装饰器函数名,等价于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     #语法糖[email protected]装饰器函数名,等价于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     #语法糖[email protected]装饰器函数名,等价于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()

  







以上是关于10-3 函数装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

装饰器181029

python 装饰器

闭包函数,装饰器

[TimLinux] Python 装饰器

python装饰器