装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去,然后面试到就持了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python,看了下面的文章保证你学会装饰器
1、先看明白下面这段代码
# 第一段 # def foo(): # print("foo") # # foo # foo() # 第二段 def foo(): print("foo") foo = lambda x: print(x+1) foo(2) # 执行lanbda表达式,而不再是原来的函数,因为foo这个名字被重新指向了另外一个匿名函数
函数名仅仅是个变量,只不过指向了定义的函数而忆,所以才能通过函数名()调用,如何函数名=xxx,被修改了,那么当在执行函数名()时,调用的就不是之前的那个函数了
第二段程序:
"""装饰器的例子""" def set_func(func): def call_func(): print("----------这是权限验证1----------") print("----------这是权限验证2----------") print("----------这是权限验证3----------") func() return call_func @set_func def test1(): print("-------test-----") test1()
这段代码就是使用了装饰器
以上这段码的结果会执行call_func函数,再执行test1函数
结果为:
----------这是权限验证1---------- ----------这是权限验证2---------- ----------这是权限验证3---------- -------test-----
那以下第三段代码用来说明装饰器的使用:
"""装饰器的实现""" def set_func(func): def call_func(): print("----------这是权限验证1----------") print("----------这是权限验证2----------") print("----------这是权限验证3----------") func() # 执行func函数,因为func变量指向函数test1,故相当于执行test1函数 return call_func # @set_func def test1(): print("-------test-----") # ret = set_func(test1) # ret() """ 定义了变量test1,等于set_func的返回值,即指向set_func的内部函数call_func函数,而实参里面的test1开始是指向test1函数的 在set_func函数内部,call_func函数的引用返回给变量test1,这时候test1变量是指向函数call_func 而set_func的实参就是函数test1的引用,func变量就指向了test1函数,func()相当于执行test1函数 """ test1= set_func(test1) test1()
从而得到以下结论:
@set_func 等价于:test1= set_func(test1)
装饰器就是将一个函数的引用当作实参传递到另外一个闭包里面去,然后这个闭包里面会调用这个函数的引用,表现形式就是在原来调用函数不变的情况下,能做到对原函数功能的扩展