Python高级---装饰器
目录
概念
装饰器就是在不改动原有代码的基础上增加一些其他的功能,进行功能的扩展。
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用户登录了")
运行结果: