python 装饰器
被装饰的函数,总是被替换成@符号所引用的函数的返回值。这是本质
因此,被装饰的函数会变成什么,完全取决于@符号所引用的函数的返回值
如果@符号所引用的函数,返回值是字符串,那被装饰的函数就被替换成了字符串
如果@符号所引用的函数,返回值是函数,那被修饰的函数在替换之后还是函数
1.
def funA(fn): print('A') fn() return "fkit" @funA def funB(): print("B") print(funB)
A
B
fkit
#funA()执行完成后返回的是fkit,因此funB就不再是函数,而是被替换成了字符串
2.@符号所引用的函数的返回值是还是函数
下面的程序定义 了一个装饰器函数foo, 该函数执行完成后并不是返回普通值,而是返回bar函数(这是关键),这意味着被该@foo修饰的函数最终都会被替换成bar函数
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 @foo def my_test(a): print("==my_test function", a) print(my_test) my_test(10) print("=="*15) my_test(6,5)
<function foo.<locals>.bar at 0x00000217E0C6B1F0> ===1=== (10,) ===2=== 90 my_test ==my_test function 90 *************** ==my_test function 90 ============================== ===1=== (6, 5) ===2=== 30 my_test ==my_test function 30 *************** ==my_test function 30 请按任意键继续. . .
例子:对函数进行参数检查
def auth(fn): def auth_fn(*args): print("------模拟权限检查------") fn(*args) return auth_fn @auth def test(a,b): print("run test function , the args is %s, %s" %(a,b)) test(10,15)
------模拟权限检查------ run test function , the args is 10, 15 请按任意键继续. . .