0. 概念
- 理解:在
函数名
以及函数体
不改变
的前提下,给函数扩展
一些额外代码
@装饰器 def 被装饰函数(): code
- 示例
def check(func): def inner(): print("登录验证...") func() return inner @check def send_message(): print("发说说") send_message()
1. 执行时间
- 立即执行
def check(func): print("哥哥被执行了") def inner(): print("登录验证...") func() return inner # @check -> send_message = check(send_message) @check def send_message(): print("发说说")
-
执行图解
执行图解.png
2. 进阶操作
- 装饰器叠加:
从上到下
装饰,从下到上
执行def line(func): def inner(): print("-" * 30) func() return inner def star(func): def inner(): print("*" * 30) func() return inner @line @star def print_content(): print("一杯敬明天,一杯敬过往。") print_content()
- 对有参数函数进行装饰
1. 无论什么场景,保证函数调用参数个数一致 2. 为了通用,可以使用不定长参数,结合拆包操作进行处理 def decorator(func): def inner(*args, **kwargs): print("-" * 30) func(*args, **kwargs) return inner @decorator def print_num(num, num2, num3): print(num, num2, num3) @decorator def print_num2(num): print(num) print_num(666, 888, num3=100) print_num2(333)
- 对有返回值函数进行装饰
1. 无论什么场景,保证函数返回值一致 def decorator(func): def inner(*args, **kwargs): print("-" * 30) res = func(*args, **kwargs) return res return inner @decorator def print_num(num, num2, num3): return num + num2 + num3 @decorator def print_num2(num): print(num) res1 = print_num(666, 888, num3=100) res2 = print_num2(333) print(res1, res2)
- 带有参数装饰器
1. 语法:@获取装饰器函数名(参数) 2. 流程:先计算 @ 后面函数,然后把函数返回值当做装饰器 def get_decorator(char): def decorator(func): def inner(*args, **kwargs): print(char * 30) res = func(*args, **kwargs) return res return inner return decorator @get_decorator("+") def pnum(num): print("66666") pnum("66666")
网友评论