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。

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

原文地址:https://www.cnblogs.com/zaizaiaipython/p/7810309.html