本文实例讲述了Python装饰器decorator用法。分享给大家供大家参考。具体分析如下:
1. 闭包(closure)
闭包是Python所支持的一种特性,它让在非global scope定义的函数可以引用其外围空间中的变量,这些外围空间中被引用的变量叫做这个函数的环境变量。环境变量和这个非全局函数一起构成了闭包。
代码如下:def outer(x):
y = [1,2,3]
def inner():
print x
print y
return inner
x = 5 #这个x没有被引用
f = outer(2)
f()
print f.__closure__ #函数属性__closure__存储了函数的环境变量 def entrance(func):
= 5 #这个x没有被引用f = outer(2)f()print f.__closure__ #函数属性__closure__存储了函数的环境变量 def entrance(func):
x和y都是属于函数outer命名空间的,在inner中被引用,当outer函数退出后,outer的命名空间不存在了,但是inner依然维护了其定义时候对其外部变量x,y的连接。
程序输出:
2
[1, 2, 3]
(, )
装饰器是一个可调用对象(a callable),在Python中,函数是对象,当然也是可调用的,所以装饰器可以是一个函数,我们称其为函数装饰器。
这个可调用对象以一个函数作为参数,闭且返回另一个函数(来替换参数那个函数)。
比如:
代码如下:def entrance(func):
def inner():
print "inside function :", func.__name__
func()
return inner
entrance是一个装饰器,它是一个函数,它可以接收一个函数func作为参数,返回了另一个函数inner。
那为什么叫装饰器了,在返回函数inner()的内部,调用了func(),而且还作了额外的操作,相当于“装饰”了函数func。
那如何使用装饰器?
代码如下:def fun1():
pass
fun1 = entrance(fun1)
def fun2():
pass
fun2 = entrance(fun2)
fun1,fun2的名字都没有变,但是通过调用函数装饰器entrance(),它们已经指向了另一个函数inner(),“装饰了”自己。
@操作符
Python提供的@符号,实质上就是上面做的,对一个函数名进行从新赋值,是语法上的技巧。所以上面的代码等价于
代码如下:@entrance
def fun1():
pass
@entrance
def fun2():
pass
2. 装饰器的用途
从这个刻意构造的很简单的例子,可以看出装饰器的意义,如果一个函数需要一个功能,如果这个功能可以被使用在很多函数上,或是函数并不是自己实现,那可以写个装饰器来实现这些功能。
新闻热点
疑难解答