当前位置:   article > 正文

Python--装饰器_装饰器有2个参数,不能直接使用@符号进行装饰

装饰器有2个参数,不能直接使用@符号进行装饰

装饰器

      在python中有一个特殊的符号  @ ,使用此符号的时候表示用后边的函数作为装饰器来装饰下面的函数,并改变下面函数的引用。
      在装饰器中大至分为两种,一种是直接使用函数引用的装饰器,与直接使用函数的装饰器。
      不管使用上面两种的哪一种装饰器,都遵循,只要代码读取到@符号并已经将一个函数引用传递给该修饰器的时候,则首先进行最外层函数的运行。

def w1(func1):
	print("---正在装饰1---")
	def inner1():
		print("--正在验证权限1---")
		func1()
	return inner1
	
@w1
def f1():
	print("---f1---")
	
f1()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

其输出结果为:

---正在装饰1---
  • 1

直接使用函数引用的装饰器

      在使用直接使用函数引用的装饰器的时候,需要在@符号的时候,后面直接跟函数名而不加括号与参数: @func 。
      在使用的时候,读取到@符号的时候将会将被修饰的函数的引用作为第一个参数传递到修饰函数中,并运行第一层函数,将被修饰函数的函数名变量等于第一层函数的返回值。
如:

def w1(func1):
	print("---正在装饰1---")
	def inner1():
		print("--正在验证权限1---")
		func1()
	return inner1
	
@w1
def f1():
	print("---f1---")
	
f1()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

其输出结果为

---正在装饰1---
--正在验证权限1---
---f1---
  • 1
  • 2
  • 3

其上边的代码相当于下面的代码:

def w1(func1):
	print("---正在装饰1---")
	def inner1():
		print("--正在验证权限1---")
		func1()
	return inner1
	

	
#@w1
def f1():
	print("---f1---")
	
f1 = w1(f1)
	
f1()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输出结果是一样的。
代码解读:首先将原来的f1函数的引用作为参数func1的值传递进去,此时func1=f1,在将最外层函数的返回值(inner1的引用),在赋值给f1。此时运行f1时相当于运行inner1函数。

直接使用函数引用装饰器对有参数和无参数函数进行装饰。

      对于装饰无参数的函数与上边直接使用函数引用装饰器的装饰器的方法是相同的,在此不再做介绍与解释。
      对于装饰有参数的函数与装饰无参数的时候使用与定于的时候是有所区别的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/213292?site
推荐阅读
相关标签
  

闽ICP备14008679号