关于python的装饰器,是将函数当作参数传递给装饰函数吗?
高洛峰
高洛峰 2016-10-29 09:53:09
[Python讨论组]

像是一般的装饰器,如下:

def wrapper(func):
    def inner(arg):
        # do something
        return func(arg)
    return inner

@wrapper
def func(arg):
    print 'func'

我都理解为将func作为参数传递给wrapper函数,之后改变func指向的函数地址。然而,下面这个我就不是很懂了?

#!/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'


高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
三叔

Filter这是带参数的装饰器。
1、_deco = Filter(Before, After)
此时_deco就是:

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

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

@_deco
def Index(request,kargs):
    print 'index'


热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号