#coding=utf-8
#装饰器就像长裤, 内裤是遮羞的,长裤可以保暖,遮羞只有内裤,长裤就为穿起来更加好看
#装饰器 是一个函数,就是在 不改变其他函数的前提下,对函数功能的扩充
#装饰器 用于以下场景
# 1 引入日志 2 函数执行时间统计 3 执行函数前预备处理
# 4 执行函数 后的清理功能 5 权限校验 6 缓存
#单个装饰器 外部函数无参数 无返回值 装饰器没有 参数 没有返回值
ff="1"*4
print(ff.center(50,"-"))
def warp1(func):
print("zheng zai zhuang shi:")
def inner():
print('zheng zai yan zheng quan xian')
func()
return inner
@warp1
def test1():
print("testing")
test1()
# test -- warp第一个print --return inner --test --inner print -- inner func -test-print
#多个装饰器,从下往上 运行 先2 后1
ff="2"*4
print(ff.center(50,"-"))
def warp_one(func):
print("111zheng zai zhuang shi111:")
def inner():
print('111zheng zai yan zheng quan xian111')
func()
return inner
def warp_two(func):
print("222zheng zai zhuang shi222:")
def inner():
print('222zheng zai yan zheng quan xian222')
func()
return inner
@warp_one
@warp_two
def test2():
print("testing")
test2()
#运行结果 先装2 后装1
#222zheng zai zhuang shi222:
#111zheng zai zhuang shi111:
#111zheng zai yan zheng quan xian111
#222zheng zai yan zheng quan xian222
#testing
# 带参数外部函数 如何装饰器
# 外部函数要参数 inner 需要对应的参数inner中的
# inner 函数中的 func 也需要对应参数
# 如果不这样就会报错 参数不对
ff="3"*4
print(ff.center(50,"-"))
def warp3(func):
print("333zheng zai zhuang shi333:")
def inner(a,b):
print('333zheng zai yan zheng quan xian333')
func(a,b)
return inner
@warp3
def test3(a,b):
c=a+b
print("testing:a+b=%d"%c)
test3(1,2)
#外部函数 有返回值 如何装饰
#如果外部的函数需要返回 那就是在inner 中 需要将func函数 return
ff="4"*4
print(ff.center(50,"-"))
def warp4(func):
print("444zheng zai zhuang shi444:")
def inner(a,b):
print('444zheng zai yan zheng quan xian444')
return func(a,b)
return inner
@warp4
def test4(a,b):
c=a+b
print("testing:a+b=%d"%c)
return 'abc'
#这里我们用 aa444 获取返回的值 ,特别注意返回值 需要变量存储 然后打印才能显示出来
aa444=test4(1,2)
print aa444
# 装饰器需要带参数,这个很方便 灵活,可以根据外部需要什么装饰 就选择什么样的参数
# 装饰器 需要参数 ,就需要再一次封装,也就是 三个函数形成 装饰函数 注意外部函数返回值 以及 其带的参数
# 多一层的封装 就是为了传递参数
ff="5"*4
print(ff.center(50,"-"))
def warp5(args):
def warpin(func):
print("555zheng zai zhuang shi555: di %d ci zhuan shi"%args)
def inner(a,b):
print('555zheng zai yan zheng quan xian555:inner zhong di %d ci zhuan shi'%args)
return func(a,b)
return inner
return warpin
@warp5(1)
def test5(a,b):
c=a+b
print("testing:a+b=%d"%c)
return 'abc'
aa55=test5(5,6)
print aa55