首页 > 其他 > 详细

装饰器

时间:2021-04-24 20:57:34      阅读:19      评论:0      收藏:0      [点我收藏+]

装饰器

-定义:本质是函数,功能是为其他函数添加附加功能

-原则

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

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

 

装饰器=高阶函数 +函数嵌套 +闭包

 

高阶函数的定义:

-函数接收的参数是函数名

import time
def foo():
time.sleep(0.1)
print(‘你们好啊‘)

def test(func):
start_time = time.time()
func()
end_time = time.time()
print(‘运行时间是:%s‘%(end_time-start_time))
test(foo)=======================》此函数接收大参数是函数名,但函数foo()的运行方式改变成了test(foo)
结果是:你们好啊
运行时间是:0.10401010513305664

-函数的返回值也是函数名

import time
def foo():
time.sleep(0.1)
print(‘你们好啊‘)

def test(func):
start_time = time.time()
func()
end_time = time.time()
print(‘运行时间是:%s‘%(end_time-start_time))
return func

foo = test(foo)======>结果是 你们好啊
运行时间是:0.10253691673278809
foo()============>结果是:你们好啊

满足上述任意一个条件都是高阶函数

 

-函数嵌套

在函数中重新定义一个函数,如下:

def foo():
print(‘你好‘)
def test():
print(‘alisa‘)
test()
ps:函数也是一个变量

- 闭包类似于作用域

 

装饰器框架(如下):

def timmer(func):
def wrapper():
print(func)
func()
return wrapper

需要计算以下函数运行的时间,写代码(用装饰器):

import time

def timmer(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print(‘程序运行时间是%s‘%(end_time-start_time))
return wrapper

def test():
time.sleep(0.3)
print(‘到此结束‘)

test = timmer(test)======》此处timmer(test)运行的结果是返回wrapper的地址
test()=======》此处相当于运行wrapper()

注意:上述倒数第二行代码中test = timmer(test)可以换成@timmer 进行简化

可以直接在需要装饰的函数前写上 @装饰器 直接对函数进行装饰

 

-需要装饰的函数添加返回值

import time
def timmer(func):
def wrapper():
start_time = time.time()
res = func()
end_time = time.time()
print(‘程序运行时间是%s‘%(end_time-start_time))
return res
return wrapper

@timmer
def test():
time.sleep(0.3)
print(‘到此结束‘)
return ‘ni‘
res =test()
print(res)

运行结果是:

到此结束
程序运行时间是0.3040931224822998
ni

- 需要装饰的函数加上多个参数

import time

def timmer(func):
def wrapper(*args,**kwargs): ======>注意:*args:上传的是以()元祖的形式,例如:(1,2,3,4)**kargs 上传的是字典的形式 如:(name = alisa)
start_time = time.time()
res = func(*args,**kwargs)
end_time = time.time()
print(‘程序运行时间是%s‘%(end_time-start_time))
return res
return wrapper

@timmer
def test(age,name):
time.sleep(0.3)
print(‘到此结束‘,‘年龄是【%s】,名字是【%s】‘%(age,name))
return ‘ni‘
test(12,‘lisa‘)

 

ps: 补充技巧 如下:

ni = [21,23,22,33,44,55,88,55]

求第一位元素
a,*_d =ni=====》a代表第一位元素,d代表最后一位元素 *代表中间元素,_代表不显示
print(a)======>第一位元素是 21

求第一位和最后一位元素
a,*_,d=ni
print(a,d)====》21,55
将a = 1 b = 2 变成 a = 2,b = 1 
a,b=2,1
print(a,b)====结果是2,1



 

装饰器

原文:https://www.cnblogs.com/wode110/p/14697587.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!