/* 时间:2021/12/18 功能:闭包/装饰器 目录: 一: 闭包 1 定义 2 简单 3 应用 4 调用外部变量 二: 装饰器 1 定义 2 完全写法 3 简略写法 4 应用 : 计算时间 5 通用装饰器 6 嵌套装饰器 7 参数装饰器 8 类装饰器 */
一: 闭包
1 定义
/* 定义: 1 函数嵌套 2 内函数使用外函数参数或变量 3 外部函数返回内部函数 */
2 简单
def func_out(): num1 = 10 def func_inner123(num2): result = num1 + num2 print("result: ", result) return func_inner123 if __name__ == '__main__': new_func = func_out() new_func(1) new_func(10)
3 应用
def config_name(name): def inner(msg): print(name + ":" + msg) print(id(inner)) # 地址不同 return inner if __name__ == '__main__': # 创建对象 : 闭包实例 tom = config_name("tom") jerry = config_name("jerry") tom("hi") jerry("hello") tom("Nice to meet you") jerry("Nice to meet you to")
4 调用外部变量
def func_out(): num1 = 10 def func_inner(): nonlocal num1 # 声明: 外部变量 num1 = 0 print(num1) func_inner() print(num1) return func_inner if __name__ == '__main__': # 创建对象 : 闭包实例 f1 = func_out() f1()
二: 装饰器
1 定义
/* 定义: 1 不修改已有函数的源代码 2 不修改已有函数的调用方式 3 给以后函数添加额外的功能 4 如果闭包函数的参数有且只有一个并且是函数类型,那么这个闭包函数称为装饰器 */
2 完全写法
# 完全写法 def decorator(func): print("装饰器: ") def inner(): print("已添加登录验证") func() return inner def comment(): print("发表评论") if __name__ == '__main__': comment = decorator(comment) comment()
3 简略写法
# 简略写法 def decorator(func): print("装饰器: ") def inner(): print("已添加登录验证") func() return inner # 装饰器语法糖写法 : @装饰器名称 @decorator # 代码封装 : comment = decorator(comment) comment=inner def comment(): print("发表评论") if __name__ == '__main__': # comment = decorator(comment) comment=inner comment()
4 应用 : 计算时间
# 计算时间 import time def decorator(func): def inner(): begin = time.time() func() end = time.time() result = end - begin print("执行时间: ", result) return inner @decorator def work(): for i in range(10000): print(i) if __name__ == '__main__': work()
5 通用装饰器
####################################### # 参数 def decorator(func): def inner(a, b): func(a, b) return inner @decorator def add_num(num1, num2): result = num1 + num2 print("result: ", result) if __name__ == '__main__': add_num(1, 2) ####################################### # 返回值 def decorator(func): def inner(a, b): result = func(a, b) return result return inner @decorator def add_num(num1, num2): result = num1 + num2 return result if __name__ == '__main__': result = add_num(1, 2) print(result) ####################################### # 通用装饰器 def decorator(func): def inner(*args, **kwargs): result = func(*args, **kwargs) return result return inner @decorator def sum_num(*args, **kwargs): result = 0 for value in args: result += value for value in kwargs.values(): result += value return result @decorator def show(): return "尽快了解了" if __name__ == '__main__': sum_num(1, 2, a=10) result = show() print(result) #######################################
6 嵌套装饰器
# 嵌套饰器 def make_div(func): print("make_div start") def inner(): result = "<div>" + func() + "</div>" return result return inner def make_p(func): print("make_p start") def inner(): result = "<p>" + func() + "</p>" return result return inner @make_div # 原理剖析: content = make_div(make_p(content)) @make_p def content(): return "人生苦短,快用python" if __name__ == '__main__': result = content() print(result)
7 参数装饰器
# 参数装饰器 def return_decorator(flag): def decorator(func): def inner(a, b): if flag == "+": print("加法计算") elif flag == "-": print("减法计算") func(a, b) return inner return decorator # 调用该函数: 返回装饰器 @return_decorator("+") def add_num(a, b): result = a + b print(result) @return_decorator("-") def sub_num(a, b): result = a - b print(result) if __name__ == '__main__': add_num(1, 2) sub_num(7, 2)
8 类装饰器
# 类装饰器 class my_decorator(object): def __init__(self, func): self.__func = func # 初始化 # __call__方法: ,让对象变成可调用的对象,可调用的对象能够像函数使用 def __call__(self, *args, **kwargs): print("over") self.__func() @my_decorator # 等价于 : show=my_decorator(show); init方法 def show(): print("show()") if __name__ == '__main__': show()