装饰器:本质上是个函数,在不改变原函数代码的状况下为函数添加功能闭包
装饰器实际上就是一个闭包函数函数
经常使用于:权限验证,用户登录注册学习
装饰器分类:普通装饰器spa
装饰带有参数的函数(定长,不定长)ci
装饰带有返回值的函数it
带有参数的装饰器(不一样函数不一样效果)权限
把类做为装饰器(后面讲)语法
装饰类(后面讲)方法
普通装饰器方法1装饰器
def xdl(func): #装饰器
def inner(): #是将来装饰后的函数
print('上学打卡')
func() #func是原函数,是bj_work函数,sh_work函数
print('放学打卡')
return inner
#北京的打卡函数 (原函数)
def bj_work():
print('开始北京的一天学习')
bj_work=xdl(bj_work) #bi_work函数==inner函数
bj_work()
#上海的打卡时间
def sh_work():
print('开始上海的一天学习')
sh_work=xdl(sh_work)
sh_work()
会输出:
上学打卡
开始北京的一天学习
放学打卡
上学打卡
开始上海的一天学习
放学打卡
普通装饰器方法2
@语法:加上@系统会自动把下面的函数当成参数传递到装饰器中,从下到上
@符又被称为语法糖
def xdl(func): #装饰器
def inner(): #是将来装饰后的函数
print('上学打卡')
func() #func是原函数,是hz_work函数
print('放学打卡')
return inner
@xdl
def hz_work():
print('开始杭州的一天学习')
hz_work()
会输出:
上学打卡
开始杭州的一天学习
放学打卡
加上@系统会自动把下面的函数当成参数传递到装饰器中,从下到上
def out_1(func):
def inner():
print('开始打卡1')
func()
print('放学打卡1')
return inner
def out_2(func):
def inner():
print('开始打卡2')
func()
print('放学打卡2')
return inner
@out_1
@out_2
def xqgz():
print('开始各个小区的一天学习')
xqgz()
会输出:
开始打卡1
开始打卡2
开始各个小区的一天学习
放学打卡2
放学打卡1
#带有参数(定长)的装饰器 inner()中的参数必定要与func()中的参数同样,能够不跟sz_work()中的参数同样
def xdl(func):
def inner(n,s):
print('上学打卡')
func(n,s)
print('放学打卡')
return inner
@xdl
def sz_work(name,sex):
print('开始深圳的一天学习')
sz_work('深圳','城市')
会输出:
上学打卡
开始深圳的一天学习
放学打卡
#带有参数(不定长)的装饰器 inner()中的参数必定要与func()中的参数同样,能够不跟sz_work()中的参数同样
def xdl(func):
def inner(*a,**k):
print('上学打卡')
func(*a,**k)
print('放学打卡')
return inner
@xdl
def sz_work(*arge,**kwargs):
print(arge,kwargs,'开始深圳的一天学习')
sz_work('深圳','城市',waihao='世界之窗')
会输出:
上学打卡
('深圳', '城市') {'waihao': '世界之窗'} 开始深圳的一天学习
放学打卡
#带有返回值的装饰器
def xdl(func):
def inner():
print('开始打卡')
zhuangtai=func()
print('放学打卡')
return zhuangtai
return inner
@xdl
def work():
print('开始工做')
return '工做结束'
res=work()
print(res)
会输出:
开始打卡
开始工做
放学打卡
工做结束
带有参数的装饰器(不一样函数有不一样效果)
def wai_out(city):#只是一个壳子 def out(func): #真实的装饰器 def inner(): if city=='上海': print('开始打卡') func() print('放学打卡') elif city=='北京': print('北京不上课') return inner return out@wai_out('上海')def sh_work(): print('开始上海一天的学习')sh_work()print('===============')@wai_out('北京')def bj_work(): print('开始北京一天的学习')bj_work()