装饰器: 不修改被装饰对象的源代码,也不修改调用方式的前提下,给被装饰对象添加新的功能
原则:开放封闭原则
开放:对扩展功能(增加功能开放),扩展功能的意思是在源代码不做任何改变的情况下,为其增加功能
封闭:对修改源代码是封闭的
无参装饰器
基本模板
Python
# 装饰器基本模板 -- 无参装饰器
def outer(func):
def wrapper(*args, **kwargs):
# 在这里要装饰之前的功能
res = func(*args, **kwargs)
# 在这里要装饰之后的功能
return res
return wrapper
案例演示
Python
# 案例演示
import time
# 使用装饰器为函数增加计时功能
def count_time(func):
def wrapper(*args, **kwargs):
# 在这里要装饰之前的功能
start_time = time.time()
res = func(*args, **kwargs)
# 在这里要装饰之后的功能
end_time = time.time()
print('函数执行一共耗时{}秒'.format(start_time-end_time))
return res
return wrapper
# 功能函数
@count_time # 使用装饰器对 time_func()进行装饰,增加了计时的功能
def time_func(n):
time.sleep(n)
print('{}秒后,打印这句话'.format(n))
if __name__ == '__main__':
time_func(5)
pycharm模板功能
使用pycharm自带的模板功能,快速创建模板
复制模板代码 ------> file ------>settings ------> editor ------> Live Templates (实时模板)
进入 Live Templates :
1、展开python,点击+ 选择 live Template
2、Abbreviation 输入快捷指令 , Description 输入模板描述, template text 粘贴进模板内容
3、点击difine ,勾选python。
完成之后,可以直接在代码编辑区输入快捷指令调出模板

完美伪装
将原函数的一些方法,传给装饰器,达到完美伪装
完美伪装的装饰器模板
Python
from functools import wraps
def outer(func):
@wraps(func) # 用处是将原函数的属性传给装饰函数
def wrapper(*args, **kwargs):
# 在这里要装饰之前的功能
res = func(*args, **kwargs)
# 在这里要装饰之后的功能
return res
return wrapper
通过 from functools import wraps 引入一个 @wraps的装饰器,将源函数的一些属性传递给装饰器。比如:
Python
print(time_func) # 查看函数的内存地址
print(time_func.__name__) # 查看函数的函数名
print(time_func.__doc__) # 查看函数的描述文档
案例:
Python
import time
from functools import wraps
# 使用装饰器为函数增加计时功能
def count_time(func):
@wraps(func) # 用处是将原函数的属性传给装饰函数
def wrapper(*args, **kwargs):
# 在这里要装饰之前的功能
start_time = time.time()
res = func(*args, **kwargs)
# 在这里要装饰之后的功能
end_time = time.time()
print('函数执行一共耗时{}秒'.format(start_time-end_time))
return res
return wrapper
# 功能函数
@count_time # 使用装饰器对 time_func()进行装饰,增加了计时的功能
def time_func(n, i):
"""
这个是一个被装饰函数
@param n:
@param i:
@return:
"""
time.sleep(n)
print('{}秒后,打印{}'.format(n, i))
if __name__ == '__main__':
# time_func(5, 'A')
print(time_func) # 查看函数的内存地址
print(time_func.__name__) # 查看函数的函数名
print(time_func.__doc__) # 查看函数的描述文档
有参装饰器
模板
Python
def g_outer(X):
def outer(func):
def wrapper(*args, **kwargs):
# 在这里要装饰之前的功能
res = func(*args, **kwargs)
# 在这里要装饰之后的功能
return res
return wrapper
return outer
应用有参装饰器时 @g_outer('X')