python之路--装饰器

二 .通用装饰器的写法

  python里面的动态代理.

  存在的意义: 在不破坏原有的函数和原有函数的调用基础上,给函数添加新的功能

def wrapper(fn): #  fn是目标函数.
    def inner(*args, **kwargs): # 为了目标函数的传参
        '''在执行目标函数之前.....'''
        ret = fn(*args, **kwargs) # 调用目标函数, ret是目标函数的返回值
        '''在执行目标函数之后....'''
        return ret  # 把目标函数返回值返回. 保证函数正常的结束
    return inner
@wrapper  # target_func = wrapper(target_func)
def target_func():
    pass
target_func() # 此时执行的是inner

二 .带有参数的装饰器

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 play(): # 被 wrapper装饰
    print("走啊,打球去")
play()

 

三 .多个装饰器装饰同一个函数

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

 

  

posted @ 2018-12-14 16:35  一个很善良的抱爱  阅读(147)  评论(0编辑  收藏  举报