Python装饰器--从闭包到装饰器

函数调用与函数自身

在学习装饰器之前我们首先要回顾一下函数与函数调用,这对接下来理解代码很有帮助。

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的调用

请仔细分析代码,并且自己动手敲几个实例


记得点赞,收藏+分享~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章