装饰器就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
装饰器的功能特点:
- 不修改已有函数的源代码
- 不修改已有函数的调用方式
- 给已有函数增加额外的功能
1. 装饰带有参数的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 添加输出日志的功能 def logging(fn): def inner(num1, num2): print("--正在努力计算--") fn(num1, num2) return inner # 使用装饰器装饰函数 @logging # 相当于 sum_num = logging(sum_num) def sum_num(a, b): result = a + b print(result) sum_num(1, 2) |
运行结果:
1 2 3 |
--正在努力计算-- 3 |
2. 装饰带有返回值的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 添加输出日志的功能 def logging(fn): def inner(num1, num2): print("--正在努力计算--") result = fn(num1, num2) return result return inner # 使用装饰器装饰函数 @logging def sum_num(a, b): result = a + b return result result = sum_num(1, 2) print(result) |
运行结果:
1 2 3 |
--正在努力计算-- 3 |
3. 装饰带有不定长参数的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 添加输出日志的功能 def logging(fn): def inner(*args, **kwargs): print("--正在努力计算--") fn(*args, **kwargs) return inner # 使用语法糖装饰函数 @logging def sum_num(*args, **kwargs): result = 0 for value in args: result += value for value in kwargs.values(): result += value print(result) sum_num(1, 2, a=10) |
运行结果:
1 2 3 |
--正在努力计算-- 13 |
4. 通用装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# 添加输出日志的功能 def logging(fn): def inner(*args, **kwargs): print("--正在努力计算--") result = fn(*args, **kwargs) return result return inner # 使用语法糖装饰函数 @logging def sum_num(*args, **kwargs): result = 0 for value in args: result += value for value in kwargs.values(): result += value return result @logging def subtraction(a, b): result = a - b print(result) result = sum_num(1, 2, a=10) print(result) subtraction(4, 2) |
运行结果:
1 2 3 4 5 |
--正在努力计算-- 13 --正在努力计算-- 2 |
5. 类装饰器
装饰器还有一种特殊的用法就是类装饰器,就是通过定义一个类来装饰函数。
类装饰器示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Check(object): def __init__(self, fn): # 初始化操作在此完成 self.__fn = fn # 实现__call__方法,表示对象是一个可调用对象,可以像调用函数一样进行调用。 def __call__(self, *args, **kwargs): # 添加装饰功能 print("请先登陆...") self.__fn() @Check def comment(): print("发表评论") comment() |