函数调用与函数自身
在学习装饰器之前我们首先要回顾一下函数与函数调用,这对接下来理解代码很有帮助。
def fun1():
pass
print(fun1()) #这里是函数调用,返回结果为None
#>> None
print(fun1) #这里是函数自身
#>> <function fun at 0x000001EE0E977C10>
也许你已经非常了解函数调用和函数自身的区别了,但是请你耐心的往下看
def fun1():
def fun2():
pass
return fun2
print(fun1()) #结合下面的结果再次分享代码,很重要
#>> <function fun1 at 0x0000020A6D978C10>
print(fun1()()) #如果你不知道为什么这么写请认真分析这段代码
#>> None
上面的代码可以帮助你很好的理解装饰器。
了解装饰器
装饰器的作用: 可以在不改变原函数的基础上,给函数增加功能。
装饰器实际上就是返回函数的函数,将一个函数当做参数,返回一个替代版的函数。
装饰器会在函数声明时调用,记住这句话
装饰器的语法
接下来我们看一下装饰器如何去定义,以及如何使用
def deco(fun): #参数接收函数,这个参数接收的是fun1函数
def deco_fun(n): #这个参数是接收参数用的
if n == 10:
return fun(n)
#增加了一个功能,判断参数的值,当满足要求时才会调用该方法
else:
pass
return deco_fun #注意这里返回的是函数不是函数调用的结果
#也许你不理解为什么这里要定义两个函数,回想一下装饰器在什么时候调用?
#deco函数中并没有调用函数,而是返回了一个函数,不是函数的调用
@deco
def fun1(n):
return '查看返回值'
print(fun1(10))
#>> 查看返回结果
print(fun)
#>> <function deco.<locals>.deco_fun at 0x000001A871CC7DC0>
#这个函数对象表示的是deco内部的deco_fun函数
#结合上面的注释和代码,你应该可以想到fun1实际上调用的是deco_fun方法同时参数10也给了deco_fun
#实际上deco_fun方法内的返回值才是对fun的调用
请仔细分析代码,并且自己动手敲几个实例
记得点赞,收藏+分享~~