装饰器,英文名字decorator。
我们开发Python代码的时候,经常碰到装饰器。
通常被装饰后的函数,会在原来的函数的基础上,增加一些功能。
通常装饰器本事也是一个函数,那么装饰器是怎么装饰另外一个函数的呢?
假设,你进入一家公司,领导要求你在老代码的基础上继续开发。
import time
def getXXXTime():
return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())
import time
# 定义一个装饰器函数
def sayLocal(func):
def inner():
ret = func()
return f'当地时间: {ret}'
return inner
def getXXXTime():
return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())
# 装饰getXXXTime()
getXXXTime = sayLocal(getXXXTime)
print(getXXXTime())
我们再看下之前的装饰器的通用模板:
def wrapper(f): # 装饰器wrapper
def inner(*args, **kwargs):
'''在装饰前要做的事情'''
ret = f(*args, **kwargs) # 被装饰的函数
'''在装饰后要做的事情'''
return ret
return inner
@wrapper # 装饰器函数名
def func(a, b): # 被装饰的函数
import time
# 定义一个装饰器函数
def sayLocal(func):
def inner():
ret = func()
return f'当地时间: {ret}'
return inner
@sayLocal
def getXXXTime():
return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())
# 装饰getXXXTime()
# getXXXTime = sayLocal(getXXXTime)
print(getXXXTime())
sayLocal函数是一个装饰器,它装饰了参数函数的行为。
以@sayLocal开头后面接装饰器函数的这种写法,是一种语法糖,也就是便捷的写法。
装饰器经常被用在库和框架中,给别的开发者使用。
这些库的开发者预料到 使用者 开发的函数可能需要 一些增强的功能。
但是 这些库的开发者 没法去改使用者的代码, 就可以把这些增强的部分做在 装饰器函数中。
这样使用者,只需要在他们的函数前面上@xxx 就使用了这些增强的功能了。
开放封闭原则:
1)多拓展是开放的;
2)对修改是封闭的;
目的是维护代码的稳定性,这个就是装饰器存在的意义。