使用**@**符号引用已有的函数(A)后,可用于修饰其它函数(B)
将被修饰函数(B)作为参数传递给@符号引用的函数(A)将函数B替换成步骤1的返回值。 使用@将被修饰的函数改造称为新函数。 In [1]: def funA(fn): ...: print('A') ...: fn() ...: return 'abc' ...: In [2]: @funA ...: def funB(): ...: print('B') ...: A B In [3]: print(funB) abc 被修饰的函数总能被替换成@符号所引用的函数的返回值,因此被修饰的函数会变成什么,完全取决于@符号所引用的函数的返回值。 In [4]: def foo(fn): ...: def bar(*args): ...: print("===1===", args) ...: n = args[0] ...: print("===2===", n*(n-1)) ...: print(fn.__name__) ...: fn(n*(n-1)) ...: print("*"*15) ...: return fn(n*(n-1)) ...: return bar ...: In [5]: @foo ...: def my_test(a): ...: print("==my_test函数==", a) ...: In [7]: my_test(10) ===1=== (10,) ===2=== 90 mt_test ==my_test函数== 90 *************** ==my_test函数== 90上面程序定义了一个装饰器函数foo,导致程序会事先执行foo(my_test),将my_test(10)替换为bar(10)。
