python装饰器

来源:互联网 发布:成都租房 知乎 编辑:程序博客网 时间:2024/06/08 05:36

廖大大留了一道题:写出一个@log的decorator,使它既支持:

@logdef f():    pass

又支持:

@log('execute')def f():    pass

尝试用判断可变参数的长度是否为零来分类输出,但是失败,因为本质上还是第二种情况。参考了网友的答案,如下:

def log(strorfunction):    if isinstance(strorfunction,str):        def decorator(func):            def wrapper(*args,**kw):                print('var has coming in!')                func(*args,**kw)            return wrapper        return decorator    else:        def wrapper(*args,**kw):            print('wo don\'t hava var')            strorfunction(*args,**kw)        return wrapper

上面的程序有助于加深我们对装饰器的理解
**

  1. 无论是第一种还是第二种情况,都会在@开始后传入变量(函数也是一个变量),不同的是传入变量的值的类型不同
  2. 装饰器的调用顺序可以从程序下面的返回顺序往上递推,进入主函数后,首先观察最下面的 return,就可以看清装饰器整个的工作流程
  3. 通过理解第二部装饰器的流程,写程序的时候就可以很从容的写出你想要的装饰器

**
这里写图片描述

原创粉丝点击