python装饰器底层_python装饰器理解

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被执行')

如有疑问,欢迎留言讨论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值