python装饰器

python装饰器,相对来说是比较难理解的知识点,但如果作为一个测开人员,装饰器是必须掌握的知识,通过使用装饰器可以对源码、已有代码进行快速改造,增加想要的功能。

学习的时候,看的时候,听的时候,觉得自己理解了,但是到自己实操时,发现卡顿,本文是自己学习后,以自己的理解,总结的文章。

假设已有一个函数,如下:

def test01():
print('这是原有函数')

这时需要记录这个函数的执行时间,我们可以直接修改函数,如下:

def test02():
print('开始执行函数')
print('这是原有函数')
print('函数执行完毕')

这样确实是实现了我们的要求,但是有两个问题:

  • 一是我们修改了原函数的逻辑,如果这个函数很复杂,可能会被我们改出问题,并且我们加入的逻辑很是与原函数业务逻辑无关的内容,不符合一个函数只做一件事的原则。
  • 二是如果后面还有加其他逻辑,要增加其他功能,又要直接修改函数,并且如果有100个函数要增加这个功能,难道我们逐一去改100个函数吗?

有没有在不修改原来函数的情况下,实现我们的要求呢?
可以用闭包。我们另外定义一个函数,在这个新的函数里面写我们的逻辑,把原函数作为一个参数传给新的函数,返回我们定义的新函数。

如下:

def test03(func):
def in_func():
print('开始执行函数')
func()
print('函数执行完毕')
return in_func

image

使用装饰函数,如下:

from test_python.homework.decorate import test03
def test01():
print('这是原有函数')
test01 = test03(test01) # test01是被装饰函数,将被装饰函数传给装饰函数
test01() # 再调用被装饰函数

image

这个执行结果也是打印出:
开始执行函数
这是原有函数
函数执行完毕

为什么会有这样的效果呢?
执行这个的时候

test01 = test03(test01) # test01是被装饰函数,将被装饰函数传给装饰函数
test01() # 再调用被装饰函数

相当于执行

def test03(test01):
def in_func():
print('开始执行函数')
test01()
print('函数执行完毕')
return in_func

首先执行test03(),执行完后是返回in_func,代码又去找in_func函数执行,就执行了
print('开始执行函数')
test01()
print('函数执行完毕')

所以结果是:
开始执行函数
这是原有函数
函数执行完毕

因为这种写法太繁琐,python简化成了@装饰函数名

test01 = test03(test01) # test01是被装饰函数,将被装饰函数传给装饰函数
test01() # 再调用被装饰函数

如:

from test_python.homework.decorate import test03
@test03 # 用test03来装饰test01
def test01():
print('这是原有函数')

image

这就是python的语法糖。

这样写,运行结果也是:
开始执行函数
这是原有函数
函数执行完毕

posted @   捷后愚生  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示