1.背景
公司有多个业务组,有一个基础平台,基础平台负责提供底层的功能,eg:数据库操作,其他业务组直接调用基础平台即可
# 基础平台功能
def f1():
print('f1被执行')
def f2():
print('f2被执行')
def f3():
print('f3被执行')
# 业务A组调用
f1()
f2()
f3()
# 业务B组调用
f1()
f2()
f3()
2.需求
现需要给基础平台增加验证功能,即:每次调用前需要进行验证
3.解决方案
方法1
# 基础平台功能
def check_f():
print('check1')
print('check2')
print('check3')
def f1():
check_f()
print('f1被执行')
def f2():
check_f()
print('f2被执行')
def f3():
check_f()
print('f3被执行')
当然,方法1也是可行的,但是未遵循‘开放封闭’原则,开放封闭原则,简单来说就是已经实现的功能代码不允许被修改,但可以被扩展,即:封闭:已实现的功能代码块
开放:对扩展开放
方法2
# 基础平台功能
def decorator(fn):
def inner():
print('check1')
print('check2')
print('check3')
fn()
return inner
@decorator
def f1():
print('f1被执行')
@decorator
def f2():
print('f2被执行')
@decorator
def f3():
print('f3被执行')
使用装饰器既能很好的解决该需求,且不违背开放封闭原则
4.理解
@函数名 是python的一种语法糖
举个
# 基础平台功能
def decorator(fn):
def inner():
print('check1')
print('check2')
print('check3')
fn()
return inner
@decorator
def f1():
print('f1被执行')
# 业务A组调用
f1()
当业务中调用f1时,首先会执行@decorator,@decorator 等价于decorator(f1),
即:执行decorator函数,把f1做为参数,传递给decorator函数,
执行decorator函数即执行以下
def inner():
print('check1')
print('check2')
print('check3')
fn()
return inner
f1是参数,此时,fn即f1
decorator的返回值 inner赋值给 @decorator下面的函数f1
所以,最后执行的f1函数(这个f1函数是新的函数,即新f1)
新f1 = def inner():
print('check1')
print('check2')
print('check3')
f1() # 原来的f1
执行结果:
print('check1')
print('check2')
print('check3')
print('f1被执行')
如有疑问,欢迎留言讨论~