python函数之装饰器

什么是装饰器?

装饰器本质上就是函数闭包

装饰器有什么用?

装饰器可以在不改变原有函数代码的情况下,给函数增加其他功能

装饰器有哪些应用场景

装饰器一般用于登录验证和修改日志

理解装饰器的前提

1.函数可以被作为参数传递到其他函数中
2.函数可以被作为函数返回值返回
3.函数可以像变量那样进行赋值

# 我想玩genshin啊于是我就定义了一个genshin函数
def genshin():
	print('你好,我是提瓦特第一应急食品派蒙')

# 我又想玩泰拉瑞亚,于是我又定义了一个terrarir函数
def terrarir():
	print("淦死渔夫!!")

# 游戏现在是可以玩了,但是玩之前还得登录验证,可是我不想修改原来的函数,于是我创建了一个助手来帮忙进行验证
# 我将游戏函数作为参数传递给了助手
def assistant(game):
	def inner():
		print('欢迎使用游戏助手')
		admin = input('请输入你的游戏账号: ')
		password = input('请输入游戏密码: ')
		if admin == 'admin' and password == 'admin':
			game()
		print('感谢你使用游戏助手,下次再来哟')
	# 将inner函数作为返回值返回
	return inner

# 现在我就要开始玩游戏了
assistant(genshin)
>>欢迎使用游戏助手
>>请输入你的游戏账号: admin
>>请输入游戏密码: admin
>>你好,我是提瓦特第一应急食品派蒙
>>感谢你使用游戏助手,下次再来哟
# 这是我没加装饰器时候的用法,怎么加装饰器呢?很简单在对应函数上方加上@+函数名
@assistant
def genshin():
	print('你好,我是提瓦特第一应急食品派蒙')
genshin()
# 这样的执行的效果和上面是一样的: genshin()相当于assistant(genshin)
@assistant
def terrarir():
	print("淦死渔夫!!")
# 同样的在泰拉瑞亚函数上面加上装饰器
terrarir()
>>欢迎使用游戏助手
>>请输入你的游戏账号: admin
>>请输入游戏密码: admin
>>淦死渔夫!!
>>感谢你使用游戏助手,下次再来哟
# 这样我就在没有修改原有函数的基础上给函数增加了一个登录校验的功能
# 游戏登录上去了,可是泰拉瑞亚我有很多个存档我还要选择一个存档进行游玩
@assistant
def terrarir(archive): # 我给泰拉瑞亚增加了一个存档参数,登录成功以后可以选择存档
	print("淦死渔夫!!")
	return f'欢迎进入{archive}'
# 同样的我得在装饰器函数里面添加一个参数并且要有返回值
def assistant(game):
# *args是位置参数,**kwargs是关键参数,这样不管函数有几个传递参数都可以解决
	def inner(*args, **kwargs):
		print('欢迎使用游戏助手')
		admin = input('请输入你的游戏账号: ')
		password = input('请输入游戏密码: ')
		if admin == 'admin' and password == 'admin':
			result = game(*args, **kwargs)
			print('感谢你使用游戏助手,下次再来哟')
			# 返回所调用函数的返回值,这样装饰器才会有返回值
			return result
	# 将inner函数作为返回值返回
	return inner
print(terrarir('萌新之家'))
>>欢迎使用游戏助手
>>请输入你的游戏账号: admin
>>请输入游戏密码: admin
>>淦死渔夫!!
>>欢迎进入萌新之家
>>感谢你使用游戏助手,下次再来哟

从上面我们可以得到通用装饰器的写法

def assistant(game):
# *args是位置参数,**kwargs是关键参数,这样不管函数有几个传递参数都可以解决
	def inner(*args, **kwargs):
		admin = input('请输入你的游戏账号: ')
		password = input('请输入游戏密码: ')
		if admin == 'admin' and password == 'admin':
			result = game(*args, **kwargs)
			# 返回所调用函数的返回值,这样装饰器才会有返回值
			return result
	# 将inner函数作为返回值返回
	return inner

在遇到需要用到的装饰器的应用场景,先把这个写下来然后在根据具体的函数内容来进行修改就可以了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guizhouspiderman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值