zoukankan      html  css  js  c++  java
  • decorate装饰器

    import time

    def deco(func):

          start_time=time.time()

          func()

          stop_time=time.time()

          print("the func run time is %s"%(stop_time-start_time))

    def test1():

          time.sleep(3)

          print("in the test1")

    def test2():

          time.sleep(3)

          print("in the test2")

    deco(test1)

    deco(test2)

    我们这串代码是想阐述这样一个问题:现在有了test1和test2这两个函数,我们想对它附加新的功能,我们不能改变他的源代码,以及他的调用方式,也就是只有test1(),不能增加其他的调用方式,我们怎么办呢,这时候我们引入了装饰器。

    首先定义了deco()这个函数,里面的func是参数,后面紧接着的5行是deco()这个函数的逻辑。然后定义了test1和test2这两个函数,然后单独的test1,或者test2其实是两个内存地址,因为deco()是可以直接运行的,所以,里面加了test1这个参数之后,就开始运行deco这个函数了,并且参数是test1,然后记录开始时间,func()其实就是test1(),然后运行test1,然后睡3秒,print,然后记录下结束时间,然后print出中间隔的时间。

    但是,作为装饰器,这有一个问题,他改变了函数的调用方式,如果没有deco这个装饰器,我们调用test1这个函数的话我们应该用test1()来调用,但是现在不是。

    如果我吧代码改一下

    import time

    def deco(func):

          start_time=time.time()

          return func()

          stop_time=time.time()

          print("the func run time is %s"%(stop_time-start_time))

    def test1():

          time.sleep(3)

          print("in the test1")

    def test2():

          time.sleep(3)

          print("in the test2")

    test1=deco(test1)

    test1()

    我们现在不想改函数的调用方式,我们利用之前的高阶函数的知识。我们想让deco(test1)变成一个内存地址,我们怎么办呢,我们可以利用return,因此我们在deco的逻辑下的第二行return了func,但是这出现了一个问题,当我们的函数运行到这一行的时候,我们直接return回去了就结束了,后面的就不运行了,因此我们要用函数的嵌套。

    import time

    def timer(func):

          def deco():

                start_time=time.time()

                func()

                stop_time=time.time()

                print("the func run time is %s"%(stop_time-start_time))

           return deco

    def test1():

          time.sleep(3)

          print('in the test1')

    def test2():

          time.sleep(3)

          print('in the test2')

    test1=timer(test1)

    test1()

    我是如何理解这串代码的:

    首先,我们这串代码是想阐述这样一个问题:现在有了test1和test2这两个函数,我们想对它附加新的功能,我们不能改变他的源代码,以及他的调用方式,也就是只有test1(),不能增加其他的调用方式,我们怎么办呢,这时候我们引入了装饰器。

    那我们最终怎么理解这个装饰器呢,下面是我的理解,我也不知道对不对,但是能把我自己说服,应该足够了。

    首先最后两行,timer(test1)是一个内存地址,因此test1()是可以运行的,timer(test1)代表一个什么内存地址呢,他的内存地址其实是由deco return回来的,因此也就是deco的内存地址,因此,我们test1=timer(test1),其实就是令参数func=test1之后得到的内存地址呗test1获取到,因此运行test1()时,开始运行deco(),记录开始时间,运行test1,记录结束时间,然后print。

    我的理解,其实装饰器,是把函数的内存地址给改了(把猫变成狗了,猫自己并不知道),然后运行的时候,我们往往是令内存地址等于我们原来的那个函数,而我们在装饰器的里面又可以运行之前的函数,这样就完成了一个装饰器。

  • 相关阅读:
    使用grep搜索多个字符串
    Linux中如何启用root用户
    Docker Image 的发布和 Container 端口映射
    IIS负载均衡
    IIS负载均衡ARR前端请求到本地服务器和后端处理服务器
    IIS http重定向https,强制用户使用https访问的配置方法-iis设置
    IIS中应用Application Request Route 配置负载均衡
    IIS配置HTTPSIIS配置HTTPS
    asp.net用户登入验证
    高频交易建模
  • 原文地址:https://www.cnblogs.com/zaizaiaipython/p/7810309.html
Copyright © 2011-2022 走看看