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

python基础知识(六)函数----(三)

2019-04-14 09:57 295 查看

(六)函数----(三)

目录

(六)函数----(三)

6.1装饰器的本质、功能、原则

6.2装饰器的固定模式

 

6.1装饰器的本质、功能、原则

       装饰器的本质:一个闭包函数 

       装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

       装饰器的原则:开放封闭原则

                                开放 : 对扩展是开放的

                                封闭 : 对修改是封闭的

       语法糖:@

6.2装饰器的固定模式

[code]#了解
import time
# print(time.time()) # 获取当前时间
#time.sleep(10)  #让程序在执行到这个位置的时候停一会儿

获取一个函数的运行时间

[code]def timer():
start = time.time() #开始时间
print('hello,python')
time.sleep(1)
end = time.time() #结束时间
print(end - start)
timer()

把执行代码转化为一个函数

[code]def f():
print('hello,python')
time.sleep(1)
def timer():
start = time.time() #开始时间
f()
end = time.time() #结束时间
print(end - start)
timer()

为了方便计算其他函数的执行时间,把函数名当作参数

[code]def f():
print('hello,python')
time.sleep(1)
def timer(f1):
start = time.time() #开始时间
f1()
end = time.time() #结束时间
print(end - start)
timer(f)

想用原函数名执行函数,加入闭包

[code]def f():
print('hello,python')
time.sleep(1)
def timer(f1):   #装饰器函数
def inner(f1) :
start = time.time() #开始时间
f1()               #被装饰函数
end = time.time() #结束时间
print(end - start)
return inner
f = timer(f)  ##inner()
f()

若原函数有返回值

[code]def f():
print('hello,python')
time.sleep(1)
return '返回值'
def timer(f1):
def inner():
start = time.time() #开始时间
ret = f1()
end = time.time() #结束时间
print(end - start)
return ret
return inner
f = timer(f)
print(f())

语法糖

              f = timer(f)----->@timer

@timmer #语法糖 @装饰器函数名         

 def f():            #被装饰的函数

[code]def timer(f1):
def inner():
start = time.time() #开始时间
ret = f1()
end = time.time() #结束时间
print(end - start)
return ret
return inner
@timer
def f():
print('hello,python')
time.sleep(1)
return '返回值'
print(f())

若原函数含参数

[code]def timer(f1):
def inner(a):
start = time.time() #开始时间
ret = f1(a)
end = time.time() #结束时间
print(end - start)
return ret
return inner
@timer
def f(a):
print(a)
time.sleep(1)
return '返回值'
print(f('hello,python'))

若含有多个参数,位置参数*args,关键字参数**kwargs

[code]def timer(f1):
def inner(*args,**kwargs):
start = time.time() #开始时间
ret = f1(*args,**kwargs)
end = time.time() #结束时间
print(end - start)
return ret
return inner
@timer
def f(a,b,c,d):
print(a,b,c,d)
time.sleep(1)
return '返回值'
print(f(1,2,3,d = 5))

装饰器的固定模式

[code]def wrapper(f):    #装饰器函数,f是被装饰的函数
def inner(*args,**kwargs):
'''在被装饰函数之前要做的事'''
ret = f(*args,**kwargs)    #被装饰的函数
'''在被装饰函数之后要做的事'''
return ret
return inner
@wrapper         #语法糖 @装饰器函数名
def func(a,b):     #被装饰的函数
print(a,b)
return 'aaa'

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: