装饰器
(一)什么是装饰器
- 装饰:代指为被装饰对象添加新的功能。
- 器:代指器具/工具。
- 装饰器与被装饰对象均可以是任意可调用对象。
装饰器定义:
- 在不修改被装饰对象源代码和调用方式的前提下为呗装饰对象添加额外的功能。
装饰器经常用于有切莫需求的场景
- 插入日志、性能测试、事物处理、缓存、权限校验等应用场景。
- 有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
(二)装饰器的作用
- 软件的设计应该遵循开放封闭原则,即对扩展是开放的,而对修改是封闭的。
- 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
- 对修改封闭,意味着对象一旦设计完成,就可以独立完成其工作,而不要对其进行修改。
- 软件包含的所有功能的源代码以及调用方式,都应该避免修改,否则一旦改错,则极有可能产生连锁反应,最终导致程序崩溃
- 而对于上线后的软件,新需求或者变化又层出不穷,我们必须为程序提供扩展的可能性,这就用到了装饰器。
(三)装饰器的分类
- 函数装饰器分为:
- 无参装饰器
- 有参装饰器
- 二者的实现原理一样,都是函数嵌套+闭包+函数对象的组合使用的产物。
(四)无参装饰器
(1)计时
- 始终遵循不修改被装饰对象的源代码
import time
#计时
def index():
time.sleep(5)
print('哈哈')
start_time=time.time()
index()
end_time=time.time()
print(end_time-start_time)
# 哈哈
# 5.0000951290130615
(2)无参装饰器模板
"""装饰器标准模板"""
def add():
return 1
def outer(func):
def inner():
"""调用func 函数之前的逻辑"""
res=func()
"""调用函数func 函数之后的逻辑"""
return res
return inner
add=outer(func=add)
add()
小练习:
# 看电影
# 用户信息字典 --- 定义用户名 和 年龄
# 大于 18 岁 看电影
# 小于 18 岁 18禁
user_info_dict={'syh':10}
def outer(func):
def inner():
if user_info_dict['syh']>=18:
res=func()
return res
else:
return '18禁'
return inner
# @outer
#调用一
def see():
return '看电影!'
see=outer(func=see)
print(see())
#调用二语法糖
@outer#see=outer(func=see)
def see():
return '已成年可以观看!'
print(see())
#校验是否是管理员!
user_info_dict={'username':'syh','is_admin':True}
def outer(func):
def inner():
if user_info_dict['username'] and user_info_dict['is_admin']:
res=func()
return res
else:
return False,'此人不是管理员!'
return inner
@outer
def add():
return True,'此人是管理员!'
print(add())
装饰器语法糖
# 看电影
# 用户信息字典 --- 定义用户名 和 年龄
# 大于 18 岁 看电影
# 小于 18 岁 18禁
user_info_dict={'syh':20}
def outer(func):
def inner():
if user_info_dict['syh']>=18:
res =func()
return res
else:
return '未满18,不能观看电影!'
return inner
#装饰器语法糖
@outer#==see=outer(func=see)
def see():
return '看电影!'
print(see())
(五)有参装饰器
(1)有参装饰器模板
"""有参装饰器模板"""
def outer(func):
def inner(*args,**kwargs):
"""调用func函数之前的逻辑,校验"""
res=func(*args,**kwargs)
"""调用func函数之后的逻辑"""
return res
return inner
def add(*args,**kwargs):
print(args)
print(kwargs)
add(1,x=888)
练习
# 看电影
# 用户信息字典 --- 定义用户名 和 年龄
# 大于 18 岁 看电影
# 小于 18 岁 18禁
def outer(func):
def inner(name,age):
if age>=18:
res=func(name,age)
return res
else:
return f'{name}才不能观看电影'
return inner
def see(name,age):
return f'{name}已经了,可以看电影'
see=outer(func=see)
print(see('syh',18))
"""装饰器语法糖"""
@outer #==see=outer(func=see)
def see(name,age):
return f'{name}已经了,可以看电影'
# see=outer(func=see)
print(see('syh',18))
标签:outer,see,func,return,装饰,def
From: https://www.cnblogs.com/suyihang/p/17899301.html