python装饰器

一、装饰器的简易版本

# 给函数index函数添加运行计时的功能
import time
def index():
    print('你好呀,大宝贝!')   
def outer(func):
    def get_time():
        start_time = time.time()
        func()
        end_time = time.time()
        print('程序运行的时间为%s' % (end_time - start_time))
    return get_time
index = outer(index)
index()

二、解决参数问题

# 给函数index,inner添加运行计时的功能
import time 
def index():
    print('你好呀,大宝贝!')
def inner(n):
    print('你好呀,小甜心!')
def outer(func):
    def get_time(*args, **kwargs):
        start_time = time.time()
        func()
        end_time = time.time()
        print('函数运行的时间为%s' % (end_time - start_time)
    return get_time
index = outer(index)
index()
inner = outer(inner)
inner(2) 

三、解决返回值问题

请为函数index和函数inner添加计时功能以及输出他们的返回值
import time
def index():
    print('你好呀,大宝贝!')
    return '真会说话!'
def inner(n):
    print('你好呀,小甜心!')
    return '我说的都是心里话'
def outer(func):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        end_time = time.time()
        print('函数运行的时间是%s' % (end_time - start_time))
        return res
    return get_time
index = outer(index)
res = index()
print(res)

四、装饰器的模板

def outer(func):
    def inner(*args, **kwargs):
        print('执行被装饰函数之前可以添加的功能')
        res = func(*args, **kwargs)
        print('执行被装饰函数之后可以添加的功能')
        return res
    return inner
index = outer(index)
index()     
   

五、装饰器的语法糖

装饰器语法糖的写作规范

'语法糖必须紧贴在被装饰函数的上方'
# 模板
def outer(func):
    def inner(*args, **kwargs):
        print('被装饰函数运行之前添加的功能')
        res = func(*args, **kwargs)
        print('被装饰函数运行之后添加的功能')
        return res
    return inner
@outer  #这句话就相当于 index = outer(index)
def index(*args, **kwargs)
    print('你真厉害!')
    

装饰器语法糖的内部机理

'语法糖可以将被装饰的函数的函数名传给装饰器当参数使用'

六、装饰器的三层语法糖

# 判断七句print执行的顺序
def outter1(func1):
    print('加载了outter1')
    def wrapper1(*args, **kwargs):
        print('执行了wapper1')
        res1 = func1(*args, **kwargs)
        return res1
    return wrapper1

def outter2(func2):
    print('加载了outter2')
    def wrapper2(*args, **kwargs):
        print('执行了wrapper2')
        res2 = func2(*args, **kwargs)
        return res2
    return wrapper2

def outter3(func3):
    print('加载了outter3')
    def wrapper3(*args, **kwargs):
        print('执行了wrapper3')
        res3 = func3(*args, **kwargs)
        return res3
    return wrapper3
@outter1
@outter2
@outter3
def index():
    print('from index')
index()rint('from index')
index()

七、装饰器的修复技术

修复技术的目的就是为了让被装饰的函数更加不容易被发现。方法就是在开头直接加上

from functools import wraps, 再在装饰器函数名下面一行添加@wraps(func)

from functools import wraps
def outer(func):
    @wraps(funcs)


八、有参装饰器

def(source_data):
    def outer(func):
        def login_auth(*args,  **kwargs):
            #核验用户的信息,信息的校验方式可以切换多种
            if source_data == 'MysQL':
                print('数据从MySQL中取')
            elif source_data == 'file':
                print('数据从file中取')
            else:
                print('用户数据不存在,无法执行函数')
        return login_auth
    return outer
@outer(MySQL)
index()
posted @ 2021-11-17 20:16  recordlife  阅读(56)  评论(0)    收藏  举报