提到装饰器,想起的就是两年前的一场面试,面试官问我,装饰器是什么?你能写一个装饰器吗?然后就没了然后~~
装饰器
装饰器:装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出
使用方法:直接在将要被装饰的对象上输入 @装饰器名称
在写装饰器前,我们先写一个函数,命名为test,然后让anjing = test,这样再去调用anjing发现就执行了test的函数
def test(): print('这是名称为test的函数') anjing = test anjing() --------结果------ 这是名称为test的函数
这里我们在写一个带参数的函数,然后把上面的test函数直接传进去
def test(): print('这是名称为test的函数') def Anjing(a): # a = test print(a) # test的内存地址 a() # 执行test print('这是名称为anjing的函数') Anjing(test) ----------结果------ <function test at 0x000000000040C1E0> 这是名称为test的函数 这是名称为anjing的函数
这里会发现,我们没有更改test的函数,但是为test装饰了一些内容(anjing的函数)
来需求了,领导说,编写的自动化,每条用例都加上打印日志和日志上传成功的字样。
有的人说,这还不简单每条用都加上print('日志上传和打印日志')不就可以了吗?但是如果用例少的话,我们可以通过这样的方法, 但是如果用例非常多,我们都每条写?是不是太麻烦,既然看过了装饰器,我们不妨写个装饰器。
# 定义一个装饰器 def fun(foo): def add(): print('日志打印') foo() print('日志上传成功') return add @fun def test01(): print('这是自动化用例01') @fun def test02(): print('这是自动化用例02') test01() test02() ----------结果------- 日志打印 这是自动化用例01 日志上传成功 日志打印 这是自动化用例02 日志上传成功
可能有的小伙伴们还有点懵,我们通过debug模式看看这个流程如何走的,然后再进行分析
分析:
1、程序运行起来,遇到第一个函数fun时候,会把函数首先储存到内存空间中,然后继续往下执行
2、继续往下走,遇到了@fun装饰器,然后继续走装饰器里面的内容。
3、执行装饰器的运行规则,把需要装饰的函数名当作参数传给fun函数,装饰函数执行它自己内部的代码后,会将它的返回值赋值给被装饰的函数。
带参数的装饰器
会发现上面用例test01没有带参数,那如果带参数的话,这个装饰器应该怎么走?我们就写一个带参数的test01
# 定义一个装饰器 def fun(foo): def add(username): print('日志打印') result = foo(username) print('日志上传成功') return result return add @fun def test01(name): print('%s运行了自动化用例01'%name) test01('anjing')
--------结果------
日志打印
anjing运行了自动化用例01
日志上传成功
这时候肯定有人会问,如果遇到了有的用例传了一个参数,有的用例传了两个参数,那这个时候怎么弄?其实很简单那啊,前面我们不是介绍了非固定传参--*args,**kwargs
# 定义一个装饰器 def fun(foo): def add(*args,**kwargs): print('日志打印') result = foo(*args,**kwargs) print('日志上传成功') return result return add @fun def test01(name,age): print('%s运行了自动化用例01,并打印了他的年龄%s'%(name,age)) @fun def test02(name): print('%s运行了自动化用例02'%name,) test01('anjing',18) test02('ceshi')
其实每个人都可能会写一个装饰器,但是如果想要在场景中灵活运用装饰器,这个就需要大家的慢慢学习了,好了,我是安静,感谢你的关注