• python杂记-5(装饰器)


    1、被装饰的函数有参数(一个参数):

    def w1(func):
        def inner(arg):
            # 验证1
            # 验证2
            # 验证3
            return func(arg)
        return inner
    
    @w1
    def f1(arg):
        printf1)

    2、被装饰的函数有参数(两个参数):

    def w1(func):
        def inner(arg1,arg2):
            # 验证1
            # 验证2
            # 验证3
            return func(arg1,arg2)
        return inner
    
    @w1
    def f1(arg1,arg2):
    print(f1)
     
    
    

    3、被装饰的函数有参数(三个参数):

    def w1(func):
        def inner(arg1,arg2,arg3):
            # 验证1
            # 验证2
            # 验证3
            return func(arg1,arg2,arg3)
        return inner
    
    @w1
    def f1(arg1,arg2,arg3):
        printf1)

    4、装饰具有处理n个参数的函数的装饰器:

    def w1(func):
        def inner(*args, **kwargs):
            # 验证1
            # 验证2
            # 验证3
            return func(*args, **kwargs)
    
        return inner
    
    
    @w1
    def f1(arg1, arg2, arg3):
        print(f1)

    5、一个函数可以被多个装饰器装饰:

    def w2(func):
        def inner(*args, **kwargs):
            # 验证1
            # 验证2
            # 验证3
            return func(*args, **kwargs)
    
        return inner
    
    
    @w1
    @w2
    def f1(arg1, arg2, arg3):
        print(f1)

    6、更牛逼的装饰器:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    def Before(request, kargs):
        print('before')
    
    
    def After(request, kargs):
        print('after')
    
    
    def Filter(before_func, after_func):
        def outer(main_func):
            def wrapper(request, kargs):
    
                before_result = before_func(request, kargs)
                if (before_result != None):
                    return before_result;
    
                main_result = main_func(request, kargs)
                if (main_result != None):
                    return main_result;
    
                after_result = after_func(request, kargs)
                if (after_result != None):
                    return after_result;
    
            return wrapper
    
        return outer
    
    
    @Filter(Before, After)
    def Index(request, kargs):
        print('index')

    7、functools.wraps

    上述的装饰器虽然已经完成了其应有的功能,即:装饰器内的函数代指了原函数,注意其只是代指而非相等,原函数的元信息没有被赋值到装饰器函数内部。例如:函数的注释信息

    def outer(func):
        def inner(*args, **kwargs):
            print(inner.__doc__)  # None
            return func()
        return inner
    
    @outer
    def function():
        """
        asdfasd
        :return:
        """
        print('func')

    如果使用@functools.wraps装饰装饰器内的函数,那么就会代指元信息和函数。

    def outer(func):
        @functools.wraps(func)
        def inner(*args, **kwargs):
            print(inner.__doc__)  # None
            return func()
        return inner
    
    @outer
    def function():
        """
        asdfasd
        :return:
        """
        print('func')
  • 相关阅读:
    Android应用性能测试之CPU和内存占用
    每天一个linux命令(30): chown命令
    安装apk时出现错误Failure [INSTALL_FAILED_DEXOPT]问题解决的方法
    android adb shell 命令大全
    adb logcat命令查看并过滤android输出log
    Ubuntu里字符编码设置
    linux下GBK->UTF-8文件编码批量转换脚本
    Android开发之如何保证Service不被杀掉(broadcast+system/app)
    android的m、mm、mmm编译命令的使用
    解决 samba不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接
  • 原文地址:https://www.cnblogs.com/LS-blog/p/6023120.html
Copyright © 2020-2023  润新知