Python高级---装饰器

本文深入解析Python装饰器的概念、原理及使用方法,探讨如何在不改动原代码基础上拓展功能,遵循OCP原则,通过实例演示装饰器在日志记录和登陆验证中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

概念

装饰器就是在不改动原有代码的基础上增加一些其他的功能,进行功能的扩展。

Python 的装饰器是一种装饰者设计模式的体现。

原理

python利用闭包实现了装饰器,如果被装饰的函数存在参数,则需要在装饰器函数的里面的函数上传递。

一个函数有了装饰器之后,在运行函数的时候首先触发的是装饰器,该装饰器会将该函数反向的传入到装饰器内部, 即例子中的 fn()。这时原代码会被装饰器包裹,之后将需要添加的代码按照合适的位置添加到 fn() 之前或之后就可以调用了,这个时候调用原代码其实是直接调用装饰器。

代码开发原则(OCP原则)

谈到装饰器就不得不说OCP原则了。

open close protocol ,即开关原则,意思的对于已经写好并稳定运行的代码,不能去修改编辑,而是要利用装饰器去给它增加新的功能。

使用方法

将需要加入原代码的功能写成一个函数,之后在原代码的上面加一个 @函数名称 ,这便是装饰器的调用方法。

举个简单的例子:
这是一个用户登陆的输出:

def login(username, password):
	print("xx用户登陆了")

login("xxx", "123456")

运行结果:
在这里插入图片描述
现在需要给这个输出增加登陆验证和记录日志的功能,可以先将这些功能分别写成一个函数:

def record_log(fn):
	def inner(username, password):
		print("开始记录日志……")
		fn(username, password)
		print("日志记录结束……")
	return inner

def validate(fn):
	def inner(username, password):
		print("开始校验……")
		fn(username, password)
		print("数据校验完成")
	return inner

为了方便观察结果,在函数中加入运行输出。
之后将这些功能加到原代码上:

@validate
@record_log
def login(username, password):
	print("xxx用户登录了")

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值