捋了一遍又一遍,终于对装饰器有了一点点的认识
基本的装饰器长这样:
defadd_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 defadd_news(arg):2 print(arg)3 defnew_dec(func):4 def new_func(*args, **kwargs):5 print("这是需要添加的内容")6 return func(*args, **kwargs)7 returnnew_func8 returnnew_dec9
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):defwrapper(fun):def inner(*args, **kwargs):print('new thing')
func(*args, **kwargs)print("another something")return
returninnerif func isNone:returnwrapperelifcallable(func):returnwrapper(func)
@logdefmy_func_1():print("func_1")
@log()defmy_func_2():print("func_2")#这个装饰器,使用时,即使加上了括号,也不会报错了,两个用法一样