关键点:
写装饰器一定要搞定楚函数名后面带小括号和不带小括号的含义。带小括号,表示调用这个函数,而不带小括号,则表示的是该函数引用地址
假设存在函数b
In [1]: def b():
...: print("123")
示例:
a = b()表示调用b函数,即会输出“123”,使用is查看 a 与 b并不指向一个对象
1 In [2]: a=b() 2 123
In [8]: a is b
Out[8]: False
a=b 则表示a引用了b的内存地址 ,并不会输出“123”,使用is可以看到a与b指向的是一个相同的对象
In [3]: a=b In [4]: a is b Out[4]: True In [5]: a() 123
不带参数的装饰器
1 def debug(func): #1 2 def wrapper():#4 3 print ("[DEBUG]: enter {}()".format(func.__name__))#7 4 return func()#8 5 return wrapper #5 6 7 def say_hello():#2 8 print ("hello!")#9 9 10 say_hello = debug(say_hello) # 添加功能并保持原函数名不变 3 执行这句代码后 调用debug(say_hello),return wrapper,相当于say_hello=wrapper 11 12 say_hello()#6 这里就相当于是调用 wrapper()