python 装饰器、内部函数、闭包简单理解

python内部函数、闭包共同之处在于都是以函数作为参数传递到函数,不同之处在于返回与调用有所区别。

1、python内部函数

python内部函数示例:

def test(*args):
    def add(*args):         #  显示的调用外部函数的参数
        return args
    return add(*args)       #  返回内部函数的直接调用

运行结果如下:
test(1,2,3)
(1,2,3)

内部函数直接引用外部函数参数,外部函数test显示的返回内部函数add的调用。
当需要在函数内部多次执行复杂任务时,内部函数非常有用,从而避免了循环和代码的堆叠重复。

2、python闭包

内部函数可以看作是一个闭包。闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。


python闭包示例:

def test(a):
    def add():                                #  没用引用外部函数的参数
        return "it‘s a callable %s" % a       #  直接在内部函数使用外部函数的参数
    return add                                #  返回内部函数本身,不返回内部函数调用

运行结果如下:
a1 = test(1)           # 动态生成的一个可以记录外部变量的函数
<function __main__.add>

a1()                   # 调用此函数
it‘s a callable 1

test(1)()              # 本身调用过程,先动态生成一个函数再进行调用
it‘s a callable 1

3、python装饰器

装饰器实质上是一个函数,它把一个函数作为输入并且返回另外一个函数,在装饰器中,通常使用下面这些python技巧:

  • *args 和 **kwargs
  • 闭包
  • 作为参数的函数

python装饰器示例:

def test(func):                           # 将函数作为参数进行传递
    def add(*args,**kwargs):
        print “it‘s a d”
        return func(*args,**kwargs)       # 内部函数进行相关操作以后,返回传递函数的调用
    return add

def func(a,b):
    return a+b

运行结果如下:
test(func)                # 将func作为函数传递进test函数进行装饰
<function __main__.add>   # 装饰后的函数,类似闭包

test(func)(1,2)           # 显示的对装饰后的函数进行调用
it‘s a d                  # 中间被装饰的过程被print出来
3

更简单的方法调用装饰器
@test                     # 同一个函数可以调用多个装饰器,执行过程中不分先后顺序
def func(a,b):
    return a+b

无论传入test()的函数func是什么,装饰器都会返回一个新的函数,其中包含test增加的额外语句。实际上,装饰器并不需要执行函数func中的代码,只是在结束前函数add调用函数func以得到的func返回的结果和附加代码的结果

装饰器本身需要传递参数的时候:

def test(cmd):                            # 将参数传递
    def exc(func):                        # 第二步进行函数作为参数传递
         def add(*args,**kwargs):
             print "it‘s a %s" % cmd
             print "begin"
             return func(*args,**kwargs)
         return add
    return exc

 运行结果如下:
 test(‘haha‘)
 <function __main__.exc>

 test(‘haha‘)(func)(1,2)            # 调用装饰器返回结果
 it‘s a haha
 begin
 3

 更简单的方法调用
 @test(‘haha‘)                     # test函数进行了参数传递
 def func(a,b):
    return a+b

python装饰器注意事项:
对func进行装饰以后,func的函数命名空间发生了变化

执行 func.__name__
add

如何指向原来的命名空间呢?python自带了functools库直接调用则行

import functools
def test(func):
    @functools.wraps(func)
    def add(*args,**kwargs):
        print "it‘s a decorator"
        return func(*args,**kwargs)
    return add

@test
def func(a,b):
    return a+b

再次运行,查看命名空间
func.__name__
func                  # 返回了本身
时间: 2024-10-13 01:52:56

python 装饰器、内部函数、闭包简单理解的相关文章

python 装饰器 一 (简单不带参数的函数)

#coding=utf-8 #python 装饰器 '''     装饰器可以用def的形式来定义.装饰器接收一个可调用对象作为输入参数, 并返回一个新的可调用对象. 装饰器新建了一个可调用对象,也就是return 返回的函数funx, 在新增的函数中,可以添加我们需要的功能,并通过调用原有函数来实现原有函数的功能 ''' def deco(func):     '''         无参数装饰器,func为被装饰的函数     '''     def _deco():         pri

python装饰器方法

前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看django官网,忽然发现,装饰器用法并不是django框架提供的,而是python的一种语法,真心汗一个,自以为python用的很熟了,看来是井底之蛙! 恰逢周末,静下心来了解一下python的装饰器方法. 谈到代码里的装饰器,很自然的想到了设计模式中的装饰器模式,为了防止再次张冠李戴,特意翻了翻设计模

python装饰器的简单理解

如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你的业务函数.或者类(人)最后把这顶帽子带在这个人头上 Python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数. # 有两个已经实现的方法def f1(): p

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

理解 Python 装饰器看这一篇就够了

讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了.于是聪明的人们发明长裤,在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后宝宝再也不冷了.装饰器就像我们这里说的长裤,在不

对Python装饰器的个人理解方法

0.说明 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘记,其实本质上还是没有多花时间去搞懂其中的细节问题. 虽然网络上已经有很多这样的文章,但显然都是别人的思想,因此自己总是记不牢,所以花点时间自己好好整理一下. 最近在对<Python核心编程>做总结,收获了不少,下面分享一下我自己对于Python装饰器的理解,后面还提供了一个较为复杂的P

关于python装饰器(Decorators)最底层理解的一句话

一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.html 一步步教你理解Python装饰器 我作完了全部的测试.

理解Python装饰器(一)

python装饰器 装饰器是什么?我也不知道该如何给装饰器下定义. 1. 装饰器是函数,因为从代码的层面上来说,它就是开发人员定义的一个函数而已: 2. 装饰器就像是类的继承一样,通过装饰符,来实现函数与函数.函数与类之间的"继承" 3. 装饰器是种特殊的语法,通过 `@函数名` 或者 `@类名` 来实现函数或类的继承,但是 装饰器不是继承,装饰器装饰的函数会被当做参数传递给装饰器,这个功能又好像 C++中的虚函数,装饰器装饰的函数用来修改装饰器本身的功能来实现额外功能的添加. 示例:

转发对python装饰器的理解

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文  http://blog.csdn.net/sxw3718401/article/details/39519587 主题 Python 最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是 AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方