• 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
    请按任意键继续. . .
  • 相关阅读:
    C# Enum转换
    Split
    WCF访问安全
    [转] 检索 COM 类工厂中 CLSID 为 {000209FF00000000C000000000000046} 的组件时失败
    ICSharpCode.SharpZipLib.dll压缩的zip包,7zip解压时出错
    js控制ctrl+p
    跨域访问WCF问题
    sql:过滤字段中是否包含数字
    序列化/反序化
    [转]RegistryKey 操作注册表
  • 原文地址:https://www.cnblogs.com/shunguo/p/15678651.html
Copyright © 2020-2023  润新知