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

装饰器

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

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

经常使用于:权限验证,用户登录注册学习

装饰器分类:普通装饰器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()
相关文章
相关标签/搜索