python闭包以及装饰器

通俗的定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变量)对于“外层”包含它的函数而言,是本地变量;

 1 #示例一:
 2 #!/usr/bin/python
 3 #encoding=utf-8
 4
 5 def add_a(num1):
 6     print "num1:%d" % num1
 7     def add_b(num2):
 8         print "num2: %d" % num2
 9         return num1 + num2
10     return add_b        #返回的是函数名
11
12 v = add_a(100)
13
14 print v
15 print v(20)
16 #执行结果:
17 root@u163:~/cp163/python# python bibao2.py
18 num1:100
19 <function add_b at 0x7f67482a35f0>
20 num2: 20
21 120
22
23 #示例二
24 #!/usr/bin/python
25 #encoding=utf-8
26
27 def  makecounter(name):
28     count = [0]
29     def counter():
30         count[0] += 1
31         print "hello",name,':', str(count[0])+" access!"
32     return  counter
33
34 test = makecounter("world")
35 print test   #<function counter at 0x7f9d2ece57d0>
36 test()
37 test()
38 test()
39
40 #执行结果:
41 root@u163:~/cp/python# python close_pkg_demo.py
42 <function counter at 0x7f102c9497d0>
43 hello world : 1 access!
44 hello world : 2 access!
45 hello world : 3 access!

装饰器:

#!/usr/bin/python
#encoding=utf-8

"""
def foo():
    print 'in foo()'

# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法'
def  timeit(func):
    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
    def  wrapper():
        start = time.clock()
        func()
        end = time.clock()
        print 'used: ', end -start
    #将包装后的函数返回
    return  wrapper

#将源函数修饰之后返回
foo = timeit(foo)
foo()
"""

#Python中内置的装饰器有三个: staticmethod、classmethod 和property
#"""使用语法糖来精简代码
import time
def timeit(func):
    def wrapper():
        start = time.clock()
        func()
        end = time.clock()
        print "used: ", end - start
    return wrapper

@timeit
def foo():
    print "in foo()"

foo()   #相当于1、先修饰函数(foo = timeit(foo) ), 2、再执行修饰之后的函数
#"""
#执行结果:
root@u163:~/cp/python# python deco_demo.py
in foo()
used:  7.4e-05

 

时间: 2024-11-03 20:12:53

python闭包以及装饰器的相关文章

详解Python中的装饰器、闭包和functools的教程_python

装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以使用装饰器模式.简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式.通过这个在Python2.6版本中被新加入的特性可以用来实现装饰器设计模式. 顺便提一句,在继续阅读之前,如果你对Python中的闭包(Closure)概念不清楚,请查看本文结尾后的附录,如果没有闭包的相关概念,很难恰当的理解P

Python 进阶_闭包 &amp;amp; 装饰器

目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引用了外层函数的局部变量(L),并且在外层函数中 return 内层函数时,这种关系就称之为闭包. 闭包的特点就是返回的内层函数还引用了外层函数的局部变量,所以要想正确的使用闭包,那么就要确保这个被内层函数引用的局部变量是不变的. EXAMPLE: In [71]: def count(): ...:

Python 中的闭包与装饰器的详解

闭包(closure)是函数式编程的重要的语法结构.闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性. 如果在一个内嵌函数里,对在外部函数内(但不是在全局作用域)的变量进行引用,那么内嵌函数就被认为是闭包(closure). 定义在外部函数内但由内部函数引用或者使用的变量称为自由变量. 总结一下,创建一个闭包必须满足以下几点: 1. 必须有一个内嵌函数 2. 内嵌函数必须引用外部函数中的变量 3. 外部函数的返回值必须是内嵌函数 ###1.闭包使用示例 先看一个闭包的例子:     I

Python中的装饰器用法详解

来源:http://www.jb51.net/article/59867.htm 来源:http://blog.csdn.net/mdl13412/article/details/22608283 这篇文章主要介绍了Python中的装饰器用法,以实例形式详细的分析了Python中的装饰器的使用技巧及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了Python中的装饰器用法.分享给大家供大家参考.具体分析如下: 这里还是先由stackoverflow上面的一个问题引起吧,如

Python深入05 装饰器

原文:Python深入05 装饰器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 装饰器最早在Python 2.

介绍Python的@property装饰器的用法

  这篇文章主要介绍了介绍Python的@property装饰器的用法,是Python学习进阶中的重要知识,代码基于Python2.x版本,需要的朋友可以参考下 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: ? 1 2 s = Student() s.score = 9999 这显然不合逻辑.为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score

Python中的装饰器用法详解_python

本文实例讲述了Python中的装饰器用法.分享给大家供大家参考.具体分析如下: 这里还是先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: 复制代码 代码如下: @makebold @makeitalic def say():    return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出的答案是: 复制代码 代码如下: def makebold(fn):    

python @age.setter 装饰器 怎么用p.age=1调用不了

问题描述 python @age.setter 装饰器 怎么用p.age=1调用不了 #源码: class Person: def init(self,name,age): print('gouzao') self.__name=name self.__age=age @property def age(self): print('thisis get') return self.__age @age.setter def age(self,value): print('jinlaileme')

理解Python中的装饰器

文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出的答案是: def makebold(fn): def wrapped(): return "<b>" + fn() + "</b>&q