【77.1】装饰器

#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

 

posted @ 2019-02-22 17:34  科学小怪癖  阅读(95)  评论(0)    收藏  举报