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
请按任意键继续. . .

 

posted @ 2021-12-12 11:31  朵朵奇fa  阅读(32)  评论(0编辑  收藏  举报