Python基础之装饰器

  • 1.装饰器


1.装饰器

  • 本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下,增加额外功能,装饰器的返回值是一个函数对象
  • 标准装饰器:
def wrapper(func):
	def inner(*args,**kwargs):
		#执行被装饰函数之前的操作
		ret=func(*args,**kwargs)
		#执行被装饰函数之后的操作
		return re
	return inner
  • 举例
#装饰函数
def out(fn):#fn是形参,但传入的是被装饰的 函数名
	def inner():
		pritn('是否登录')
		fn()# 相当于调用传入的函数
	return inner
#标准版
#被装饰函数
def test():
	print('查看个人信息')
#使用装饰器
ot=out(test)
ot()#调用装饰器里的inner函数

*语法糖的使用: @装饰器名称

#装饰函数
def out(fn):#fn是形参,但传入的是被装饰的 函数名
	def inner():
		pritn('是否登录')
		fn()# 相当于调用传入的函数
	return inner
	#使用装饰器
@out
#被装饰函数
def test():
	print('查看个人信息')

test()
  • 有参数的装饰函数:
  • 当被装饰函数有参数时,装饰函数必要有对应参数,通过被装饰函数传入的参数可以在装饰函数与被装饰函数中使用
  • 当被装饰函数无参数时,装饰函数的参数可通过被装饰函数传入
def out(fn):
	def inner(a,b):
		print('内部函数变量',a,b)
		fn()
	return inner
@out
def test():
	pritn('被装饰函数')
test(1,2)
  • 被装饰函数有可变参数
  • 当被装饰函数没有传参时,装饰函数,没有形参不报错,但传入参数会报错
  • 当被装饰函数传入参数,装饰函数有形参,但里面的调用函数没有形参时,被装饰函数的使用参数为空
def out(fn):
	def inner():
		print('开始执行被装饰函数')
		fn()
		print('执行完毕')
	return inner
def test(*args,**kwargs):
	print(args,kwargs)
ot=out(test)
ot()
#开始执行被装饰函数
#() {}
#执行完成
ot('asd',name='fd')# 报错
def out(fn):
	def inner(*args,**kwargs):
		print('开始执行被装饰函数')
		fn()
		#fn(*args,**kwargs)
		print('执行完毕')
	return inner
def test(*args,**kwargs):
	print(args,kwargs)
ot=out(test)
ot('脑后','你上次说',name='fds')
#开始执行被装饰函数
#() {}
#执行完成
  • 多个装饰器
  • 被装饰函数先加载离自己最近的装饰函数
def out1(fn):
	def inner():
		return '你好漂亮 '+fn()+' 我也很美~'
	return inner
def out2(fn):
	def inner():
		return '神一般 '+fn()+' 花一样'
	return inner
#被装饰函数
@out1
@out2
def mtest():
	return '被装饰函数'
print(mtest())# 你好漂亮 神一般 被装饰函数 花一样 我也很美~



  • 外求者,十年如一日;内求者可一日如十年