python的装饰器

捋了一遍又一遍,终于对装饰器有了一点点的认识

基本的装饰器长这样:

def add_news(func):
  def new_func(*args, **kwargs):
    print("这是新添加的内容")
    return func(*args, **kwargs)
  return new_func

@add_news
def my_func():
  print("----something-----")

if __name__ == "__main__":
  my_func()

#解释器解释时,基本装饰器实际是这样执行的:
#my_func = add_news(my_func)
#my_func 此时指向 new_func 函数

#调用 my_func() 前,解释器是会直接执行以上部分的!!!!

#my_func() 相当于 new_func()

高级一点的装饰器长这样:

 1 def add_news(arg):
 2     print(arg)
 3     def new_dec(func):
 4         def new_func(*args, **kwargs):
 5             print("这是需要添加的内容")
 6             return func(*args, **kwargs)
 7         return new_func
 8     return new_dec
 9 
10 @add_news("sixsam")
11 def my_func(name="tom"):
12     print("your name is {}".format(name))    

#相当于:
#my_func = add_news("sixsam").(my_func)

#add_news("sixsam") ,返回了 new_dec
#new_dec(my_func) ,返回了 new_func

#注意,解释器解释到有装饰器的时候,以上部分是会直接执行的

#最后,调用 my_func() 时,
#相当于执行了 new_func()

 然后,下面这个代码,就说的通了,之前一直不明白

def log(func=None):
    def wrapper(fun):
        def inner(*args, **kwargs):
            print('new thing')
            func(*args, **kwargs)
            print("another something")
            return
        return inner
    
    if func is None:
        return wrapper
    elif callable(func):
        return wrapper(func)

@log
def my_func_1():
    print("func_1")

@log()
def my_func_2():
    print("func_2")

#这个装饰器,使用时,即使加上了括号,也不会报错了,两个用法一样

 

posted @ 2019-06-18 15:30  ClassName  阅读(178)  评论(0)    收藏  举报