Python 中 @装修器的用法简单介绍

↘锁芯ラ 提交于 2020-02-10 16:34:14

在这里主要是想介绍下,Python中的@装饰器。这里就直接举几个例子来说明一下(主要是为了使自己不要太容易忘掉这个@的简单的用法)。
首先,举个最简单的例子:

				def log(func):
					print "start %s" %func
				@log
				def func_a():
					print "this is the function of a"

这个代码,如果运行起来的话,运行结果如下所示:

			start <function func_a at 0x7f33e59b3668>

这里如果按照一般的解读的话,会发现出来一个@运算符,然后我就自行忽略掉这个不常见的符号,接下来又是一个函数的定义,整个代码中没有任何执行函数的代码,可是运行的时候,却出现结果了?为什么会这样?主要是因为@运算符的原因。@运算符,这里叫做装饰器,它表示的意思是:

			func_a = log(func_a)

也就是说:@运算符后边的变量log是一个函数对象。然后@log后边的func_a函数,是作为log的形参的。所以@log,就是执行了log(func_a)这个函数,所以就打印了上面结果的输出。
接下来讲一个比较实用的代码,也就是为了在每次函数执行的时候,都打印一些比较基础log的信息:

1 #-*- coding: utf-8 -*-
  2 def log(func):
  3     def wrapper(*arg,**kw):
  4         print"Start%s"%func
  5         print arg
  6         print kw
  7     return wrapper
  8 @log
  9 #@log 这个等价于
 10 #   func_a = log(func_a)
 11 #然而这里需要注意的是log返回的函数是wrapper
 12 #所以这里的func_a = log(func_a) = wrapper
 13 #所以这里的func_a函数就是现在的wrapper函数了!
 14 #所以你执行func_a的时候就得是执行wrapper了,因为现在func_a
 15 #就是wrapper函数了,可以理解为引用!
 16 def func_a():
 17     print"This is the function a"
 18 @log
 19 def func_b(arg):
 20     print"this is the function b"
 21 func_a((1,2,3),name="hello")

这里的关于@的解释,在代码中也详细的解释了。但是一定要记住@这个装饰器表示的是:@后边跟的变量名为被调用的函数,@后边定义的函数,作为被调用函数的一个形参。然后作为形参的函数作为左值运算对象,作为@后边变量的函数作为右值。也就是这个公式:

			function_1(func)
			@function_1
			function_2()
			@function_1表示的意思就是function_2=function_1(function_2)

在这里还需要解释的一点是:function_1()和function_1是两个不一样的东西,function_1()表示的是调用function_1这个函数;而function_1表示的是function_1这个函数,不会调用这个函数,可以作为赋值运算符的右值对象!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!