亿万教师在线注册平台关于python的装饰器,是将函数当作参数转达给装饰函数吗?

像是普通的装饰器,如下:

def wrapperfunc:
    def innerarg:
        # do something
        return funcarg
    return inner

@wrapper
def funcarg:
    print func

我都理解为将func作为参数转达给wrapper函数,之后改动func指向的函数地点。
但是,下面这个我就不是很懂了?

#!/usr/bin/env python
#coding:utf-8
  
def Beforerequest,kargs:
    print before
      
def Afterrequest,kargs:
    print after
  
  
def Filterbefore_func,after_func:
    def outermain_func:
        def wrapperrequest,kargs:
              
            before_result = before_funcrequest,kargs
            ifbefore_result != None:
                return before_result;
              
            main_result = main_funcrequest,kargs
            ifmain_result != None:
                return main_result;
              
            after_result = after_funcrequest,kargs
            ifafter_result != None:
                return after_result;
              
        return wrapper
    return outer
      
@FilterBefore, After
def Indexrequest,kargs:
    print index

Filter这是带参数的装饰器。
1、_deco = FilterBefore, After
此时_deco便是:

def outermain_func:
    def wrapperrequest,kargs:
          
        before_result = before_funcrequest,kargs
        ifbefore_result != None:
            return before_result;
          
        main_result = main_funcrequest,kargs
        ifmain_result != None:
            return main_result;
          
        after_result = after_funcrequest,kargs
        ifafter_result != None:
            return after_result;
          
    return wrapper

2、_deco这是一个新的装饰器,也便是楼主所理解的那个平凡的装饰器。
用_deco去修饰Index:

@_deco
def Indexrequest,kargs:
    print index

下面答复都是对的,标题中的第二个装饰器真实便是带参数的而已:
你的Index函数便是:

index = FilterBefore, Afterindex

拆成两个步伐来看

decorater = FilterBefore, After

@decorater
def Indexrequest,kargs:
    print index

装饰器便是一个函数,以是它分为有参数和无参数的。
你描绘的第二种便是带参数的,这个Filterbefore_func,after_func函数,前往的才是一个装饰器。

分析一下,它的实行进程

@FilterBefore, After
def Indexrequest,kargs:
    print index

1,起首调用FilterBefore, After这个函数,Filter这个函数前往outer函数。(Before, After这两个参数由闭包缘由,曾经被封到了outer函数里面)

2,前往的outer便是一个装饰器,如许就和你描绘的第一种情况一样了。

大约有点绕,细心想想也就想通了。

装饰器前往一个新的函数, 这个函数对原函数的参数或后果, 乃至构造中断了二次封装

先实行FilterBefore, After 失掉一个函数, 该函数会承受参数[func, args, *kws]

失掉的这个函数再去装饰 Index

实际上可以写成如许

Index = FilterBefore, AfterIndex

(看完/读完)这篇文章有何感想! 亿万先生在线注册平台的分享…

发表评论

姓名 *
电子邮件 *
站点