zoukankan      html  css  js  c++  java
  • python自定义带参数和不带参数的装饰器

    前言:首先,我们需要知道在python中的函数也是对象,是对象就可以作为参数传递,这是装饰器实现的基础。

    需求:定义某个方法来完成某事、现在想让该方法完成某事的同时能计算出它需要花费多少时间来完成。

    实现:在python中我们一般使用语法糖@ 来调用别人写好的装饰器 ,下面主要介绍自定义装饰器满足以上需求(带参数和不带参数)。

    第一种:不带参数

    #定义装饰器、不带参数
    def show_time(func):
        def inner():
            start_time=time.time()
            func()   #传进来的是myWay  然后加() 相当于调用方法
            end_time=time.time()
            print("执行方法所需时间为:",end_time - start_time)
        return inner   #这里记住返回的是引用,没有()
    
    @show_time     #这里使用自定义的装饰器   这里其实等价于 myWay=show_time(myWay)  ----》然后再myWay()
    def myWay():
        print("------正在执行测试--------")
        time.sleep(1)
    
    myWay()   #调用方法

    第二种:带参数

    #定义一个带参数的装饰器
    def test_addData(data):
        def decorator(fun):
            def inner():
                start_time=time.time()
                fun()
                end_time=time.time()
                print("一共费时:",end_time-start_time,f"装饰器传进来的参数:{data}")
            return inner
        return decorator
    
    @test_addData("我是测试用例噢")  #使用装饰器
    def testDemo():
        print("------正在执行测试--------")
        time.sleep(1)
    testDemo()

    运行结果

            

     总结(1)自定义不带参数的装饰器时、一般定义两层即可。通俗的说就是定义一个函数(称为外函数)、在外函数内再定义一个函数(成为内函数),其中内函数中用到了外函数的一个临时变量(就是外函数的参数),最后外函数返回的结果是内函数的函数名(没有)

    (2)定义带参数的装饰器时、一般需要我们定义三层函数、然后依次返回对象

    注:以上是自定义的最简单的装饰器、可根据自己需求自行扩充。

  • 相关阅读:
    C# winform开发:Graphics、pictureBox同时画多个矩形
    C# “配置系统未能初始化” 异常解决
    Google Maps API V3 之 路线服务
    Google Maps API V3 之 图层
    Google Maps API V3 之绘图库 信息窗口
    Google 地图 API V3 之 叠加层
    驱动开发之libusb函数
    libusb的使用教程和例子
    libusb检测U盘插入
    使用libusb检测USB设备插拔状态
  • 原文地址:https://www.cnblogs.com/yanghr/p/14676746.html
Copyright © 2011-2022 走看看