zoukankan      html  css  js  c++  java
  • 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
    请按任意键继续. . .
  • 相关阅读:
    jsoncpp使用
    java学习笔记12--国际化
    java学习笔记13--比较器(Comparable、Comparator)
    java学习笔记15--引用传递
    java学习笔记16--异常
    Java学习笔记——File类之文件管理和读写操作、下载图片
    java学习笔记3
    我的二十一天CoreJava 学习笔记
    大数据处理方面的 7 个开源搜索引擎
    GridView编辑删除操作
  • 原文地址:https://www.cnblogs.com/shunguo/p/15678651.html
Copyright © 2011-2022 走看看