1、装饰器
1) 什么是装饰器
·装饰器是一个函数,主要作用是用来包装另一个函数或者类
·包装的目的是在不改变原函数(或类名)的情况下改变被包装对象的行为(增加项目的功能)
2)函数装饰器
是指装饰器是一个函数,传入的是一个函数,返回的是一个函数
3)语法
def 装饰器函数名(参数):
语句块
return 函数对象
@装饰器函数名
def 函数名(形参列表):
语句块
4)原理:被装饰函数的变量(函数名)绑定装饰器函数调用的返回的函数
5)示例
# 此示例示意函数装饰器的定义及调用和装饰原理
# 相当于更换了 myfun() 绑定的函数
def mydeco(fn): # <<<---- 装饰器函数
def fx():
print("fx被调用")
return fx
@mydeco
def myfun():
print("myfun被调用")
myfun()
上述mydeco的原理是在 def myfun语句之后加了如下语句 myfun = mydeco(myfun),如下所:
def mydeco(fn): # <<<---- 装饰器函数
def fx():
print("fx被调用")
return fx
def myfun():
print("myfun被调用")
myfun = mydeco(myfun)
myfun()
输出如下所示:
fx被调用
6)此示例示意装饰器函数用来包装装饰器函数
def mydeco(fn):
def fx():
print("-------装饰器被调用之前--------")
fn()
print("-------装饰器被调用之后--------")
return fx
@mydeco
def myfun():
print("myfun被调用")
myfun() # 调用myfun()
7)此示例示意装饰器的应用场合及功能
# 在员工A 和员工B 都不能够进行二次开发的情况下,以下是员工C 写的装饰器,增加权限验证功能
def privileged_check(fn):
def fx(name,x):
print("正在验证。。。")
if True:
fn(name,x)
else:
print("权限验证失败")
return fx
##--- 分隔 ---
# 员工A 的代码:实现存钱、取钱业务功能实现
@privileged_check
def savemoney(name,x): # 存钱业务
print(name,'存钱',x,'元')
##--- 分隔 ---
@privileged_check
def getmoney(name,x):
print(name,'取钱',x,'元')
##--- 分隔 ---
# 员工B 代码:存钱、取钱
savemoney('小王',200)
savemoney('小赵',400)
getmoney('小李',500)
输出如下:
正在验证。。。
小王 存钱 200 元
正在验证。。。
小赵 存钱 400 元
正在验证。。。
小李 取钱 500 元
8)上例扩展。在原有基础上增加:存钱、取钱完成之后的发送短信功能
def privileged_check(fn): # 装饰器
def fx(name,x):
print("正在验证。。。")
if True:
fn(name,x)
else:
print("权限验证失败")
return fx
##---分隔符---
def messege_send(fn):
def fy(n,money):
fn(n,money) # 调用被装饰函数
print("正在发送短信。。。")
return fy
##---分隔符---
@messege_send # 相当于双层包装,由内向外调用
@privileged_check
def savemoney(name,x): # 存钱业务
print(name,'存钱',x,'元')
##---分隔符---
@messege_send # 相当于双层包装,由内向外调用
@privileged_check
def getmoney(name,x):
print(name,'取钱',x,'元')
##---分隔符---
savemoney('小王',200)
savemoney('小赵',400)
getmoney('小李',500)