使用**@**符号引用已有的函数(A)后,可用于修饰其它函数(B) 将被修饰函数(B)作为参数传递给@符号引用的函数(A) 将函数B替换成步骤1的返回值。 使用@将被修饰的函数改造称为
使用**@**符号引用已有的函数(A)后,可用于修饰其它函数(B)
使用@将被修饰的函数改造称为新函数。
...: print('A')
...: fn()
...: return 'abc'
...:
In [2]: @funA
...: def funB():
...: print('B')
...:
A
B
In [3]: print(funB)
abc
- 被修饰的函数总能被替换成@符号所引用的函数的返回值,因此被修饰的函数会变成什么,完全取决于@符号所引用的函数的返回值。
...: 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)。