• 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)定义带参数的装饰器时、一般需要我们定义三层函数、然后依次返回对象

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

  • 相关阅读:
    【memesuite】 FATAL: Template does not contain data section
    可变剪切位点强度计算[自用]
    面试官:分布式环境下,如何实现 Session共享
    MySQL 大表优化方案,收藏了细看
    为什么我们不用数据库生成 ID?
    10 分钟彻底理解 Redis 的持久化和主从复制
    linux系统变为只读,提示Readonly file system的解决办法
    一文读懂MySQL所有日志
    一次简单的 JVM 调优
    读文献BioNet: an RPackage for the functional analysis of biological networks
  • 原文地址:https://www.cnblogs.com/yanghr/p/14676746.html
Copyright © 2020-2023  润新知