初学python不久,面试遇到装饰器不会,回来查阅资料有感。
第一篇 博客,希望不要出错。
装饰器也是一种函数,能为已经存在的函数添加新的功能,像添加日志,性能测试等等。提到装饰器免不了提到闭包,提到闭包就会提到内嵌函数。所以按我的理解,解释这些(如有不对,请指出)。
内嵌函数:顾名思义是函数内部声明的函数,如:
def foo1(): x = 2 def foo2(): print x+1 foo2() foo1()输出是 3
上面函数:运行foo1()函数,foo1()内部调用foo2(),foo2()寻找x的值,内部作用域中,没有就去外部作用域找。
闭包:能够读取其他函数内部变量的函数
def foo1(x): def foo2(): print x+1 return foo2() foo1(4)
输出 5
看到这个与上面的区别了吗?
这个函数传入一个参数,直接返回一个函数。可以看到函数foo2()记住其外层作用域的事实,可以用来构造本质上有一个硬编码参数的自定义函数。然而在python中,任何都可以看成对象,函数也可以看成对象。
def foo1(fun): def foo2(): fun() return foo2() def fun(): print 1 foo1(fun)
输出 1
把函数看成对象传入函数,可以实现。而且在foo1()中可以为fun()添加一些其他的功能,不影响他自己功能,这是不是和装饰器的定义类似了。
装饰器:
def decorate(func): def foo(*args,**kwargs): print("it is runing") return func() return foo @decorate def num(): for i in range(5): print i num()
输出:
it is runing
01
2
3
4
一个简单的装饰器。简单理解就是创建一个新函数,并且把久函数当作参数调用,并在新函数添加一些新功能,但不会改变久函数的功能。
这是我的简单理解,有错请纠正我,谢谢。