`
elprup
  • 浏览: 115197 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python 装饰函数的理解

阅读更多
python 装饰函数是指这样一种神奇的函数。你在某个函数声明之前添加一行@func()之类的语句,于是,你可以对某个函数的各种行为进行编程。你可以在函数执行前后执行操作,改变函数接受的值,甚至可以完全忽略某个函数而执行其他的函数。我们把这样的函数称为装饰函数。装饰函数困扰了我很久的时间,特别是从C语言函数的角度,你是很难理解python函数可以作为一个对象进行操作这个概念。

其实,装饰函数并没有那么高深,只是需要我们一步一步慢慢来。

事实1 python中函数是一个对象,函数调用对应的是,调用这个对象的__call__方法。

class foo():
    pass

a=foo
a() # 失败,显示foo不能被调用( not callable)

class foowithcall():
    def __call__(self):
        print 'hello'

b=foowithcall
b() # 成功
从上面的例子我们看出,foo本身只是一个对象,而如果我们为它加上了call方法,它就变成了类似于函数的对象。

事实2 嵌套函数定义中,外层声明变量对内层函数可见
def foo():
    i = 88
    def bar():
        print i
        return
    return bar()

foo() # 打印88


============================================================================


基于以上两个事实,我们就可以开始编写自己的装饰函数了。首先介绍一下@符号。这个符号加在函数的前面,系统自动的将之下的函数作为参数对象传递给@后的方法。

def foo()
    def atholder(f):
        print f
        return f
    return atholder

@foo()
def hello():
    print 'hello'

hello()

难点:这时,系统遇到带@方法的函数,将hello函数对象(并不包括hello后面的括号)作为参数传递给foo()返回的函数。(请仔细体会这句),执行后得到了return f这个函数对象,在调用这个对象上的call方法。

而我们在atholder里面就可以对f进行加工了,最常见的莫过于返回一个函数对象,其中包括了f的操作。

装饰函数
def foo():
    def atholder(f):
        def func(*args,**kwargs):
            print 'before'
            ret = f(*args,**kwargs)
            print 'after'
            return ret
        return func
    return atholder

@foo()
def hello():
    print 'hello'

这是一个标准的对hello函数的装饰。其实就是将hello函数对象作为参数传给了atholder后,atholder返回了另一个函数对象,这个函数对象天生的知道了hello对象的存在,并且可以接收参数,再传递给hello对象。

  ==========================================================================================
||   Ecclesiastes 1:14 我 见 日 光 之 下 所 作 的 一 切 事 , 都 是 虚 空 , 都 是 捕 风
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
分享到:
评论

相关推荐

    12个步骤教你理解Python装饰器

    或许你已经用过装饰器,它的使用方式非常简单但理解起来困难(其实真正理解的也很简单),想要理解装饰器,你需要懂点函数式编程的概念,python函数的定义以及函数调用的语法规则等,虽然我没法把装饰器变得简单,...

    python之装饰器,多重装饰器,多层函数装饰器

    作用:实现python装饰器。 闭包三要素: – 必须有一个内嵌函数。 – 内嵌函数必须引用外部函数中变量。 – 外部函数返回值必须是内嵌函数。 闭包函数的调用方式: 变量 = 外部函数名(参数) 变量(参数) 函数名变量...

    [翻译]理解python中的装饰器1

    [翻译]理解python中的装饰器[翻译]理解PYTHON中的装饰器[翻译]理解python中的装饰器python的函数是对象函数引用手工装饰器装饰器阐述最后回

    12步教你理解Python装饰器

    在Python里,函数是用def关键字后跟一个函数名称和一个可选的参数表列来创建的,可以用关键字return指定返回值。下面让我们创建和调用一个最简单的函数: >>> def foo(): ... return 1 >>> foo() 1 该函数的函数体...

    python中多个装饰器的调用顺序详解

    一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)。 原代码 执行结果 装饰顺序 : 就近原则 被...

    Python装饰器用法实例总结

    本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下: 写装饰器 装饰器只不过是一种函数,接收被装饰的可调用对象作为它的唯一参数,然后返回一个可调用对象(就像前面的简单例子) 注意重要的一点,...

    Python3入门视频教程百度网盘.pdf

    第7章 包、模块、函数与变量作⽤域 第8章 Python函数 第9章 ⾼级部分:⾯向对象 第10章 正则表达式与JSON 第11章 Python的⾼级语法与⽤法 第12章 函数式编程: 匿名函数、⾼阶函数、装饰器 第13章 实战:原⽣爬⾍ 第...

    深入理解Python装饰器

    装饰器最早在Python 2.5中出现,它最初被用于加工函数和方法这样的可调用对象(callable object,这样的对象定义有__call__方法)。在Python 2.6以及之后的Python版本中,装饰器被进一步用于加工类。 装饰器主要是...

    python丨闭包丨装饰器.zip

    理解多个装饰器同时对一个函数的装饰过程 理解什么是多继承 理解MRO顺序的意义 super的作用 能够从内存的角度理解类属性和实例属性的区别 掌握定义property属性的两种方式:装饰器形式和类属性形式 了解常用魔方属性...

    Python装饰器使用你可能不知道的几种姿势

    一、在装饰器中获取被装饰函数的参数 假设我们在开发web的时候,需要做反爬。要判断接口的访问来源我们就可以通过下面装饰器的方法来实现: def mydecorator(func): def wrapped(*args, **kwargs): print(进入...

    详解Python装饰器由浅入深

    装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法。要理解在Python中装饰器的原理,需要一步一步来。本文尽量描述得浅显易懂,从最基础的内容讲起。 (注:以下使用...

    简单说明Python中的装饰器的用法

    装饰器对与Python新手以至于熟悉Python的人都是一个难理解, 难写的东西. 那么今天就分享一下我对Python 装饰器的理解 所谓装饰器仅仅是一种语法糖, 可作用的对象可以是函数也可以是类, 装饰器本身是一个函数, 其主要...

    实例详解Python装饰器与闭包

    闭包是Python装饰器的基础。要理解闭包,先要了解Python中的变量作用域规则。 变量作用域规则 首先,在函数中是能访问全局变量的: >>> a = 'global var' >>> def foo(): print(a) >>> foo() global var 然后,在...

    简单实用的python教程(通过一个个具体的实用案例快速掌握python项目应用)

    Python进阶通过实例详解装饰器(附代码) 你真的了解Python中的日期时间处理吗? Python进阶一步步理解Python中的元类metaclass Python进阶理解Python中的异步IO和协程(Coroutine),并应用在爬虫中 Python中最好用的...

    python程序设计基础与应用.docx

    python程序设计基础与应用 Python程序设计基础与应用是学习Python编程的基础... 除此之外,本课程还将教授一些关于编写可重用的Python函数的技巧,如中间函数、装饰器以及偏函数等。此外,学生也会学习在Python中创建自

    初识python之装饰器

    我在这儿,分享一下我学习python装饰器的心得体会。 目录初识python之装饰器一、函数调用函数与装饰器装饰函数程序示例:调用运行结果:程序示例:调用运行结果:二、当装饰器函数需要参数时…程序示例:调用运行...

    Python 装饰器深入理解

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切。 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚...

    Python如何创建装饰器时保留函数元信息

    主要介绍了Python如何创建装饰器时保留函数元信息,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

    Python学习之路——函数的闭包与装饰器

    很多初次接触到python的小伙伴可能并不理解闭包是什么,为什么有闭包,闭包有什么用,那么今天博主就从这三点来为大家讲解一下python的闭包 一、闭包是什么 官方定义: 在计算机科学中,闭包(英语:Closure),又称词法...

Global site tag (gtag.js) - Google Analytics