装饰器(重点,难点)
开闭原则: 
           对功能的扩展开放
           对代码的修改是封闭的
在目标函数前和后插入一段新的代码.不改变原来的代码
通用装饰器写法:
# 存在的意义: 在不破坏原有函数调用的基础上,给韩式添加新的功能
        def wrapper(fn):   # fn是目标函数
            def inner(*args, **kwargs): # 聚合, 为了目标函数的传参
                \'\'\'\'在目标函数之前....\'\'\'\'
                ret = fn(*arg, **kwargs) # 打散, 调用目标函数,ret是目标韩式的返回值
                \'\'\'\'在目标函数之后....\'\'\'
                return ret    #把目标函数返回值返回.保证函数正常的结束
            return inner
 
        @wrapper   ###  func = wrapper(func)  == @wrapper
        def func():
            pass
####  func = wrapper(func)    #此时fn就是func
        func()    #此时执行的是inner
举例造人
def wrapper(fn):
    def inner():
        print(\'浇水\')
        fn()
        print(\'睡一觉\')
    return inner
 
def zaoren():
    print(\'捏个泥人\')
    print(\'吹口仙气\')
    print(\'你就出来了\')
 
zaoren = wrapper(zaoren)
zaoren()
同一个函数被多个装饰器装饰
   @wrapper1
        @wrapper2
        @wrapper3
        def func():
            pass
 
       1  2  3  func 3  2  1
def wrapper1(fn):
    def inner(*args, **kwargs):
        print(\"1111111\")
        ret = fn(*args, **kwargs)
        print(\"2222222\")
        return ret
    return inner
 
def wrapper2(fn):
    def inner(*args, **kwargs):
        print(\"3333333\")
        ret = fn(*args, **kwargs)
        print(\"44444444\")
        return ret
    return inner
 
def wrapper3(fn):
    def inner(*args, **kwargs):
        print(\"555555\")
        ret = fn(*args, **kwargs)
        print(\"666666\")
        return ret
    return inner
 
 
# 就近原则
@wrapper1
@wrapper2
@wrapper3
def func():
    print(\"我是可怜的func\")
 
func()
# 1 2 3  func 3 2 1
##1111111
3333333
555555
我是可怜的func
666666
44444444
2222222
带参数的装饰器(难受)
        def wrapper_out(参数):
            def wrapper(fn):
                def inner(*args, **kwargs): # 聚合
                    在目标函数之前
                    ret = fn(*arg, **kwargs) # 打散
                    在目标函数之后
                    return ret
                return inner
            return wrapper
 
        @wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
        def func():
            pass
 
    eval  =>  文件操作
    装饰器
    函数
开始举例
def wrapper(fn):
    def inner(*args, **kwargs):
        print(\'问问金老板,行情怎么样啊\')
        ret = fn(*args, **kwargs)
        print(\'金老板骗我,恨你\')
        return ret
    return inner
 
def yue():
    print(\'走啊,约不?\')
yue = wrapper(yue)
yue()
进行判断
def wrapper_out(flag): # 装饰器本身的参数
    def wrapper(fn): # 目标函数
        def inner(*args, **kwargs): # 目标函数执行需要的参数
            if flag == True:
                print(\"问问金老板. 行情怎么样啊\")
                ret = fn(*args, **kwargs) # 在执行目标函数之前
                print(\"金老板骗我. 恨你\")
                return ret
            else:
                ret = fn(*args, **kwargs)  # 在执行目标函数之前
                return ret
        return inner
    return wrapper
 
 
# 语法糖 @装饰器
@wrapper_out(True) # 先执行wrapper_out(True) 返回一个装饰器   再和@拼接  @装饰器
def yue(): # 被 wrapper装饰
    print(\"走啊. 约不?\")
 
yue()
 
收藏 打印