python基础第二十三章:装饰器


装饰器

装饰器:本质上是个函数,在不改变原函数代码的情况下为函数添加功能

装饰器实际上就是一个闭包函数

常用于:权限验证,用户登陆注册

装饰器分类:普通装饰器

      装饰带有参数的函数(定长,不定长)

      装饰带有返回值的函数

      带有参数的装饰器(不同函数不同效果)

      把类作为装饰器(后面讲)

      装饰类(后面讲)

普通装饰器方法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()

优质内容筛选与推荐>>
1、HDU 4864 Task(贪心)
2、按钮点击跳转页面
3、转: 用css把图片转为灰色图
4、java 中 contains() containsKey() containsvalue() 使用
5、RabbitMQ 集群


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号