zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    CI框架 -- 核心文件 之 Loader.php(加载器)
    CI框架 -- 核心文件 之 Lang.php(加载语言包)
    CI框架 -- 核心文件 之 Input.php(输入数据处理文件)
    CI框架 -- 核心文件 之 Hooks.php
    CI框架 -- 核心文件 之 Exceptions.php
    CI框架 -- 配置文件config.php
    网站后台发通知页面效果图
    校内通知-Notifications表增加老师,家长,学生发送范围字段
    jqGrid设置指定行的背景色
    SQLServer数据库监控代码
  • 原文地址:https://www.cnblogs.com/LS-blog/p/6023120.html
Copyright © 2011-2022 走看看