python初学者(七)----装饰器基础

 所谓装饰器,说白了,本质上就是函数,装饰其他函数,为其他函数添加新的功能

装饰器的原则就是以下两点:

1,不能修改被装饰的函数的代码

2,不能修改被装饰函数的调用方式

在说装饰器之前,我要先介绍一下高级函数和嵌套函数,因为装饰器说白了就是由高级函数和嵌套函数构成的,所以,先介绍一下他们

高级函数

 把一个函数名作为实参传给另一个函数,返回值中包含函数名,

例如,代码如下:

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

是不是看着有些懵?不用懵,给你们解释一下,其实就是写了一个函数而已,这个函数中有一个函数func()

warpper()也是一个函数,而*args,**kwargs这两个就是个参数,这两个参数呢,可以传入任何值,但是,当传入函数的时候

return返回的就是函数的地址值了,这样,就构成了所谓的高级函数!

而函数中还有一个函数,这个函数就是func()函数,这个函数就是传进来的函数值,在warpper函数中执行,返回值为函数的地址

返回的地址值,即可拿来用了

好了,高级函数没啥了,就这,下面就说一下嵌套函数吧

嵌套函数其实更简单,我都不用贴代码了,就是一个函数中还有另一个函数的调用,好了,这两个基础的东西就介绍完了,那么下面

就开始吃正餐了,装饰器代码,先写一个简单的例子看看吧:

#!/user/bin/env python
# -*- coding:utf-8 -*-
# Author:yongzheng

#此乃装饰器最简单的例子是也
import time   #导入时间

#此为装饰器代码
def timer(func):#函数的嵌套使用
    def deco():#高阶函数的使用
        start_time = time.time()
        func()#此处为time1函数的调用,因为传入了func参数其实就是time1函数,在高阶函数中进行了函数的调用,因此,其实time1函数的执行其实就是在装饰器中执行的
        end_time = time.time()
        print("耗时 %s" %(end_time-start_time))
    return deco#返回值为函数地址

@timer#此处就相当于装饰器的引用,即test1 = timer(test1)
def time1():
    time.sleep(1)
    print("aaaaaaaaaa")



time1()

以上就是一个简单的装饰器代码,解释一下,time1()就是简单的调用了函数,而@timer就是使用了装饰器,上面注释写清楚了

@timer的作用明明白白,

好了,那下面就看看这个装饰器,这个装饰器就是由高级函数和嵌套函数组成的,timer函数内部嵌套了一个函数,返回值也是

一个函数,函数地址拿到了之后,执行也执行这个函数

这就是一个装饰器,在不改变time1函数的代码,也不改变调用time1()函数的调用方式,只是加了一个装饰器,本来的函数无非是

打印一行字符串,而加上了装饰器之后加上了一个新功能,这个功能就是计算出打印的时间

补充一点东西

#补充一点,如果有一个函数有参数,一个函数没有参数,那么,为了让这个装饰器都能使用,有一个办法,就是给装饰器加上非固定参数,即,如下
# def timer(func):
#     def deco(*args,**kwargs):#此处写法为固定写法,无论你有几个参数还是没有参数,使用此装饰器都不会报错,*args和**kwargs为固定写法,记住即可

#         if ...:
#             #代码存储位置
#     return deco

下面写了一段伪代码,注释写的明明白白的,能看懂不各位?哈哈,不解释了,再解释就啰嗦了,看不懂的留言吧 大笑



猜你喜欢

转载自blog.csdn.net/u011228868/article/details/79149473