Python装饰器

Posted ming-hui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python装饰器相关的知识,希望对你有一定的参考价值。

一、装饰器的定义

装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

简单版本的装饰器:

技术分享图片
#简单的装饰器
def func():
    print(小明)
def timmer(f):
    def inner():
        start_time = time.time()
        time.sleep(0.1)
        f()
        end_time = time.time()
        print(----> 执行效率%s % (end_time - start_time))
    return inner
func = timmer(func)  # inner
func() # inner()
简单版本的装饰器

带语法糖版本的装饰器:

技术分享图片
语法糖 @
def timmer(f):
    def inner():
        start_time = time.time()
        time.sleep(0.1)
        f()
        end_time = time.time()
        print(----> 执行效率%s % (end_time - start_time))
    return inner
@timmer  # func = timmer(func)
def func():
    print(小明)
func() # inner()
带语法糖的装饰器

带参数的装饰器:

技术分享图片
#带参数的装饰器
def timmer(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        f(*args,**kwargs)
        end_time = time.time()
        print(----> 执行效率%s % (end_time - start_time))
    return inner
@timmer  # func = timmer(func)
def func(a):
    print(%s小明%a)
func(AAA)
带参数的装饰器

带返回值的装饰器:

技术分享图片
# 带返回值的装饰器
def timmer(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        ret = f(*args,**kwargs)  # 222
        end_time = time.time()
        print(----> 执行效率%s % (end_time - start_time))
        return ret
    return inner
@timmer  # func = timmer(func)
def func(a):
    return 222
print(func(小明))
带返回值的装饰器

通用装饰器:

技术分享图片
#通用装饰器
def wrapper(func):
    def inner(*args,**kwargs):
        ‘‘‘执行函数前操作‘‘‘
        ret = func(*args,**kwargs)
        ‘‘‘执行函数后的操作‘‘‘
        return ret
    return inner

@wrapper
def func():
    print(66)
func()
通用装饰器

带开关的装饰器:

技术分享图片
import time
flag = False
def timmer_out(f):
    def timmer(func):
        def inner(*args,**kwargs):
            ‘‘‘执行函数前操作‘‘‘
            if f:
                start_time = time.time()
                time.sleep(0.3)
                ret = func(*args,**kwargs)
                ‘‘‘执行函数后操作‘‘‘
                end_time = time.time()
                print(执行效率%s%(end_time - start_time))
                return ret
            else:
                ret = func(*args,**kwargs)
                return ret
        return inner
    return timmer

@timmer_out(flag)  # 1, timmer_out(flag)  返回 timmer  --->
def f1():         # 2,  @timmer 就是你认识的装饰器 f1 = timmer(f1)
    print(666)
@timmer_out(flag)  # f2 = timmer(f2)
def f2():
    print(777)
f1()
f2()
带开关的装饰器

多个装饰器装饰一个函数:

技术分享图片
def wrapper1(func):  # func = f
    def inner1():
        print(wrapper1 ,before func)
        func()
        print(wrapper1 ,after func)
    return inner1

def wrapper2(func):  # func = inner1
    def inner2():
        print(wrapper2 ,before func)
        func()
        print(wrapper2 ,after func)
    return inner2

@wrapper2     # f = wrapper2(f)  里面的f == inner1   外面的f = inner2
@wrapper1     # f = wrapper1(f)  返回inner1    f = inner1
def f():
    print(in f)
f()  # inner2()
多个装饰器装饰一个函数

 

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

[TimLinux] Python 装饰器

python装饰器

python装饰器关键代码

Python装饰器

python之装饰器

python 装饰器