你了解python装饰器吗?

597 篇文章 17 订阅
100 篇文章 2 订阅

装饰器

装饰器:装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出

使用方法:直接在将要被装饰的对象上输入 @装饰器名称

在写装饰器前,我们先写一个函数,命名为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')

在这里插入图片描述
其实每个人都可能会写一个装饰器,但是如果想要在场景中灵活运用装饰器,这个就需要大家的慢慢学习了

点赞关注~~持续分享,了解更多,加入我们。642830685,免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值