您的位置:首页 > 编程语言 > Python开发

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

2018-01-24 15:38 169 查看
 所谓装饰器,说白了,本质上就是函数,装饰其他函数,为其他函数添加新的功能

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

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

下面写了一段伪代码,注释写的明明白白的,能看懂不各位?哈哈,不解释了,再解释就啰嗦了,看不懂的留言吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: