Loading

装饰器


1.定义

在不改变被装饰对象内部代码和调用方式的基础上,从而实现新添功能的工具

2.原则

开放封闭原则
即,对扩展开放/对修改封闭

3.简易版装饰器

给函数添加统计执行时间的功能

# 版本演绎1.0版本

import time  # 导入时间模块
# 定义一个被装饰的函数对象
def index():
    start_time = time.sleep(2)
    print('from index >>>')
# 定义一个实现实现计时功能的函数
def get_time():
    start_time = time.time()
    index()
    end_time = time.time()
    print('函数运行时间:%s' % (end_time-start_time))
get_time()

image

# 版本演绎2.0版本
# 给函数添加统计执行时间的功能
import time  # 导入时间模块

# 定义一个被装饰的函数对象
def index():
    start_time = time.sleep(2)
    print('from index >>>')

# 闭包函数,目的是将get_time这个函数名传给index
def outer(func):
    # 定义一个实现实现计时功能的函数
    # func = index
    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函数名传值到outer函数中,最后返还get_time函数名,再复制给假的index变量名
index()

image

4.装饰器(解决函数传值问题)

# 版本演绎3.0版本
# 给函数添加统计执行时间的功能
import time  # 导入时间模块

# 定义一个被装饰的函数对象
def index():
    time.sleep(2)
    print('from index >>>')
def login(name):
    time.sleep(1)
    print('%s from login >>>' % name)
# 闭包函数
def outer(func):
    # 定义一个实现实现计时功能的函数
    # func = login
    def get_time(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        print('函数运行时间:%s' % (end_time-start_time))
    return get_time
login = outer(login)
login('alan')

image

5.装饰器(解决返回值问题)

# 给函数添加统计执行时间的功能
import time  # 导入时间模块

# 定义一个被装饰的函数对象
def index():
    time.sleep(2)
    print('from index >>>')
def login(name):
    time.sleep(1)
    # print('%s from login >>>' % name)
    return 0
print(login('alan'))
# 闭包函数
def outer(func):
    # 定义一个实现实现计时功能的函数
    # func = login
    def get_time(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        # print('函数运行时间:%s' % (end_time-start_time))
    return get_time
login = outer(login)
login('alan')
print(login('alan'))

image

改进

6.装饰器模板

7.使用装饰器实现认证功能

8.装饰器语法糖

9.双层装饰器

10.装饰器修复技术

11.有参装饰器

posted @ 2021-11-18 02:57  爱learn  阅读(20)  评论(0编辑  收藏  举报