• 今天,该让 python 上个热门


    01、普通装饰器

    解 python 各种装饰器的实现,我们先来看一个普通的装饰器函数。

    1. def decorator(fun):
    2. def func_w():
    3. print('---装饰器扩展的新功能')
    4. fun()
    5. return func_w
    6. @decorator :
    7. def func_demo(a,b):
    8. res = a/b
    9. print('a除B的结果为:',res)
    10. # @decorator这是样的写法是python中的一个语法糖,
    11. #它的一个等同所有就是原来的这句 @decorator=====》func_demo= decorator(func_demo)

    **装饰器原理阐述:**将被装饰的函数当做一个参数传到装饰器中,并且让被装饰的函数名指向装饰器内部的函数,在装饰器的内部函数中用接收到的参数再调用被装饰的函数。
     

    **案列、**使用装饰器来统计函数运行的时间

    1. import time
    2. def decorator(func):
    3. def fun():
    4. strat_time = time.time() #获取开始时的时间
    5. func() #运行被装饰的函数
    6. end_time = time.time() # 获取结束时的时间
    7. t_time = end_time - strat_time #算出运行总时间
    8. print('运行总时间%s'%t_time) #打印运行总时间
    9. return fun
    10. @decorator
    11. def work():
    12. time.sleep(2)
    13. print('原来函数的功能代码')
    14. work()
    如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386   
    【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337

    02、装饰带参数的函数

    ● 被装饰器的函数带参数怎么处理?

    在内部的闭包函数中接收一个参数,然后在调用原功能函数时再把接收到的参数传入即可。

    1. def decorator(func):
    2. def fun(a,b):
    3. print('-----装饰器实现的功能-------'))
    4. func(a,b)
    5. return fun
    6. @decorator
    7. def func(a,b):
    8. print("----执行函数--func-----")
    9. print(a+b)

    03、通用装饰器

    ● 被装饰的函数,一部分带参数,一部分不带参数怎么处理?

    ○ 如果同一个装饰器既要装饰有参数的函数,又要装饰无参数的函数,那么我们在传参的时候就设置成不定长参数,这样不管被装饰的函数有没有参数都能用。

    1. def decorator(func):
    2. def fun(*args,**kwargs):
    3. print('-----执行装饰器实现的功能-------')
    4. func(*args,**kwargs)
    5. return fun
    6. @decorator
    7. def func(a,b,f):
    8. print("----执行函数--func-----")
    9. print(a+b+f)
    10. func(10,20,30)

    04、装饰器装饰类

    装饰器装饰类本质上和装饰函数没有区别,同样是把被装饰的类和函数当成参数传入装饰器中,把返回的结果传递给原来定义的类去接收。

    就是说装饰完之后,原来定义的类名,指向的就是装饰器内部的嵌套函数了。

    1. def decorator(func):
    2. def fun(*args,**kwargs):
    3. print('-----执行装饰器实现的功能-------')
    4. return func(*args,**kwargs)
    5. return fun
    6. @decorator # @decorator 等同于 Hero = decorator(Hero)
    7. class Hero(object):
    8. def __init__(self,name,age):
    9. self.name=name
    10. self.age=age
    11. print('正在初始化')
    12. def move(self):
    13. print('%s在快速移动'%self.name)
    14. laoli = Hero('老李',19)

    使用类装饰器的时候,记得要返回被装饰的类调用的结果。

    05、装饰器传参数

    前面介绍的几种装饰器在使用的时候不需要传递参数,那么如果在装饰器的时候需要传参数该怎么去实现呢?

    1. # 定义可以传参的装饰器
    2. def musen(name, age):
    3. def decoreter(func):
    4. def wrapper(*args, **kwargs):
    5. print("装饰器传递的参数name:", name)
    6. print("装饰器传递的参数age:", age)
    7. func(*args, **kwargs)
    8. return wrapper
    9. return decoreter
    10. # 使用装饰器并传参
    11. @musen('木森',18)
    12. def work():
    13. print('原功能函数的代码')
    14. # 代码解析:上面装饰的哪一行代码,的效果等同于work = musen('木森',18)(work)
    15. # 意思就是先调用musen('木森',18) 使用调用的结果去装饰work,然后再把结果赋值给work

    总结:

    ● 最外层参数,接收的是装饰器的参数

    ● 第二层参数,接收是被装饰的函数

    ● 第三层参数,接收的是被装饰函数的参数

    06、类实现装饰器

    前面我们是用闭包函数来实现的装饰器,那么接下来给大家扩展一下,使用类来当做一个装饰器来用

    ● 如果要把类当做一个装饰器来用,有两步操作,

    ○ 首先在 __init__ 方法中,把被装饰的函数赋值给一个实例属性,

    ○ 然后再了类里面实现一个 __call__ 方法,在 call 方法中调用原来的函数。

    1. class Test(object):
    2. def __init__(self,func):
    3. self.func = func
    4. def __call__(self, *args, **kwargs):
    5. print('这个是类装饰器')
    6. self.func(*args,**kwargs)
    7. #说明:
    8. #1. 当用Test来装作装饰器对func函数进行装饰的时候,首先会创建Test的实例对象,并且会把func这个函数名当做参数传递到__init__方法中,即在__init__方法中的func变量指向了func函数体
    9. #2. func函数相当于指向了用Test创建出来的实例对象
    10. #3. 当在使用func()进行调用时,就相当于让这个对象(),因此会调用这个对象的__call__方法
    11. #4. 为了能够在__call__方法中调用原来func指向的函数体,所以在__init__方法中就需要一个实例属性来保存这个函数体的引用,所以才有了self.__func = func这句代码,从而在调用__call__方法中能够调用到func之前的函数体

  • 相关阅读:
    常用TS总结
    跨境电商卖家必知的【圣诞节营销】终极指南(二)
    【蓝桥杯国赛真题05】python读数系统 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析
    数字时代的自我呈现:探索个人形象打造的创新工具——FaceChain深度学习模型工具
    (48)STM32——图片显示实验
    Redis——新数据类型
    Flutter学习笔记 -- 常量与变量、内置类型
    JAVA学习(方法的定义和调用)
    如何查找无物流信息单号
    linux命令集合
  • 原文地址:https://blog.csdn.net/A18285759691/article/details/133914948