彩世界平台-彩世界时时app-彩世界开奖app苹果下载

热门关键词: 彩世界平台,彩世界时时app,彩世界开奖app苹果下载

您的位置:彩世界平台 > 彩世界平台 > 装饰器,

装饰器,

发布时间:2019-09-01 00:07编辑:彩世界平台浏览(152)

    装饰器,

    装饰器 = 高阶函数 + 嵌套函数

      高阶函数:将一个函数作为实参进行传递    

      def func():

        print("func")

      def test(func):

        print("test")  

        func()

      test()

      嵌套函数: 在一个函数体内定义另一个函数  

      x = 0

      def test1():

        x = 1

        def test2():

          x = 2

          print(x)

        test2()

      test1()    --> 2  嵌套函数的作用域和局部变量的作用域一致

    装饰器的特性:1、不改变被装饰函数的源代码

       2、不改变被装饰函数的运行方式

    import time

    #装饰器

    def timer(func):

      def deco():

        start_time = time.time()

        func()

        stop_time = time.time()

      return deco

    #原函数

    @timer      #相当于 test1 = timer(test1)

    def test1():

      time.sleep(3)   #休眠3s

      print("test1")

     

    @timer

    def test2():

      time.sleep(3)

      print("test2")

     

    test1()

    test2()

    装饰器 = 高阶函数 + 嵌套函数 高阶函数:将一个函数作为实参进行传递 def func(): print("func") def test(func): print("test") func() test() 嵌套...

    6.4、装饰器,6.4装饰器


    装饰器:

    意义:在不能改变原函数的源代码,和在不改变整个项目中原函数的调用方式的情况下,给函数添加新的功能

     

    由于不允许改变函数的源代码,在忽略调用方式的情况下,我们可能会有以下结果:

    def decorator(func):
        func()
        print("logging")
    
    def test1():
        print("test1")
    
    def test2():
        print("Test2")
    
    decorator(test1)
    decorator(test2)
    

     

    但这改变了原本的调用方式,原本是test1(),现在是decorator(test1)

     

     

    那么如果我们为了使调用方式不变,是否可以使装饰好的函数decorator的返回值是一个我们需要的函数,再赋值给原来的函数名呢?

    于是:

    def timmer1(func):
        def warpper():
            start_time = time.time()
            func()
            stop_time=time.time()
            print("the func run time is %s"%(stop_time-start_time))
         return warpper
    
    test3=timmer1(test3)
    

    好像上面这段代码并没有改变原来的调用方式,调用原来的test3,相当于运行timmer1中的warpper

     

    如果对于无参数的函数来说,上面的代码已经实现了我们的目的,但对于带参数的函数,上面的代码没有传入参数,所以仍然需要修改

     

    于是:

    def timmer2(func):
        def warpper(*args,**kwargs):
            start_time = time.time()
            func(*args,**kwargs)
            stop_time=time.time()
            print("the func run time is %s"%(stop_time-start_time))
        return warpper
    

    在上上面的代码中,由于实质上,test3已经等于wrapper,所以可以直接使用,test3(参数)来传入参数,为了处理参数不确定数量问题,可以使用可变长度参数

     

     

    上面代码还存在一个问题,无法获取原本函数中的返回值,那么我们还需要加上一些东西:

    import time
    def timmer2(func):
        def warpper(*args,**kwargs):
            start_time = time.time()
            res=func(*args,**kwargs)
            return res
            stop_time=time.time()
            print("the func run time is %s"%(stop_time-start_time))
        return warpper
    

    使用一个变量记录下原函数的返回值。

     

     

    这样我们就实现了装饰器的基本功能。


    本文由彩世界平台发布于彩世界平台,转载请注明出处:装饰器,

    关键词:

上一篇:索引一:什么是索引

下一篇:没有了