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
    请按任意键继续. . .
  • 相关阅读:
    linux命令及相关配置
    EditPlus配置ftp连接linux
    06_事件机制
    HTTP协议简介
    Codeforces Round #691 (Div. 2) C. Row GCD (数学)
    Codeforces Round #690 (Div. 3) E2. Close Tuples (hard version) (数学,组合数)
    牛客编程巅峰赛S2第10场
    Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree (dfs计数,树)
    牛客编程巅峰赛S2第7场
    Codeforces Global Round 12 D. Rating Compression (思维,双指针)
  • 原文地址:https://www.cnblogs.com/shunguo/p/15678651.html
Copyright © 2011-2022 走看看