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
    请按任意键继续. . .
  • 相关阅读:
    Python之while循环
    Python之分支语句
    Python之变量
    Python开挂的吧!
    xshell 连接 ubuntu 16.04报错
    js中的script标签
    javascript中的事件学习总结
    【JAVAWEB学习笔记】04_JavaScript
    【JAVAWEB学习笔记】03_JavaScript
    【JAVAWEB学习笔记】02_HTML&CSS
  • 原文地址:https://www.cnblogs.com/shunguo/p/15678651.html
Copyright © 2011-2022 走看看