装饰器 心已赠人 2021-09-20 12:00 388阅读 0赞 定义: 器字代表函数,装饰器本质是函数;装饰:装饰其他函数,就是为其他函数添加附加功能 原则: 1.不能修改被装饰函数的源代码(在不修改被装饰函数源代码的情况下为其添加功能) 2.不能修改被装饰的函数的调用函数,被装饰函数不知道被装饰了 实现装饰器需要了解: 1.函数及变量:内存存储函数方式与存储变量一样:内存中存储函数体,再指向函数名 ![1340828-20181016190754626-1752749094.png][] 2.高阶函数 a.把一个函数名当作实参传给另外个函数(在不修改被装饰函数源代码的情况下为其添加功能) b.返回值中包含函数名(不修改函数的调用方式) 1 import time 2 def bar():#bar是这个函数的门牌号 3 time.sleep(2) 4 print('in the bar') 5 def test1(func):#不是装饰器,是因为函数的调用方式test1(bar)被更改了 6 start_time=time.time() 7 func() 8 stop_time=time.time() 9 print('the func fun time is %s' % (stop_time-start_time)) 10 11 test1(bar) #func=bar 运行结果: ![1340828-20181016191328692-223325658.png][] 1 import time 2 def bar():#bar是这个函数的门牌号 3 time.sleep(2) 4 print('in the bar') 5 6 def test2(func): 7 print(func) 8 return func 9 10 print(test2(bar)) 11 print('--------------------') 12 bar=test2(bar) 13 print('--------------------') 14 bar() 运行结果: ![1340828-20181016200918924-881471804.png][] 3.嵌套函数:在已定义的函数内部再定义函数 1 def foo(): 2 print('in the foo') 3 def bar():#bar具有局部变量的特性 4 print('in the bar') 通过高阶函数和嵌套函数实现装饰器功能: 1 import time 2 3 def timer(func):#在被装饰函数之外嵌套装饰器函数,添加装饰功能 4 def deco(*args,**kwargs):#不固定参数参数 5 start_time=time.time() 6 result=func(*args,**kwargs)#被装饰的函数在这运行 7 stop_time=time.time() 8 print('the func run time is %s' % (stop_time-start_time)) 9 10 return result#加入了返回值 11 return deco#timer这个函数返回了deco函数的地址 12 13 @timer#@timer等于test1=timer(test1):返回了deco函数的内存地址赋给了test1,此时test1是新的test1,这时的test1已经有了装饰器的功能 14 def test1(): 15 time.sleep(3) 16 print('in the test1') 17 18 @timer#test2=timer(test2),deco=test2 19 def test2(name): 20 time.sleep(3) 21 print('test2:',name) 22 print('in the test2') 23 return 'from test2'#加入了返回,装饰器内的函数也要加返回 24 25 test1() 26 print('-----------------') 27 print(test2('tao'))#print打印函数的返回值 运行结果: ![1340828-20181016193453966-105595851.png][] 所以说,装饰器就是将被装饰函数在装饰器函数内执行,再将装饰器函数赋予被装饰函数名,之后再执行被装饰函数时就相当于执行了装饰器函数,即在没有改变被装饰函数的源代码和调用方式的情况下,实现了装饰的功能。 实现加入参数的装饰器: 1 user,passwd='Tao','abc' 2 def auth(auth_type):#与未加参数的装饰器区别:装饰器多加了一个参数,要多嵌套一层函数;auth返回的仍是wrapper这个函数 3 def outer_wrapper(func):#注意加入的参数和func的位置 4 def wrapper(*args, **kwargs):#auth函数返回out_wrapper,out_wrapper函数返回wrapper,所以auth函数返回的仍是wrapper这个函数 5 6 #判断参数 7 if auth_type=='local': 8 username = input('username:').strip() 9 password = input('passwd:').strip() 10 11 if user == username and passwd == password: 12 print('欢迎') 13 res = func(*args, **kwargs) #当被装饰函数有返回值时 14 return res 15 else: 16 exit('错误') 17 18 #判断参数 19 elif auth_type=='ldap': 20 print('ldap无法实现') 21 22 return wrapper 23 24 return outer_wrapper 25 26 27 28 def index(): 29 print('welcome to index page') 30 31 @auth(auth_type='local')#auth返回了wrapper这个函数赋给了home 32 def home(): 33 print('welcome to home page') 34 return "from home" #加入了返回,装饰器内的函数也要加返回 35 36 @auth(auth_type='ldap')#auth返回了wrapper这个函数赋给了bbs 37 def bbs(): 38 print('welcome to bbs page') 39 40 index() 41 print('--------------------') 42 print(home())#打印函数的返回值即from home 43 print('--------------------') 44 bbs() 运行结果: ![1340828-20181016200254143-2063868001.png][] 转载于:https://www.cnblogs.com/BIT-taozhen/p/9800324.html [1340828-20181016190754626-1752749094.png]: /images/20210726/16d1b17e5f0d4e9c9ae605e048e86abf.png [1340828-20181016191328692-223325658.png]: /images/20210726/01993f5e27bf4163bcdf142274925e0b.png [1340828-20181016200918924-881471804.png]: /images/20210726/676c122b047e456a97a4b01aeae4615e.png [1340828-20181016193453966-105595851.png]: /images/20210726/9ecbb4e82faf441c88cff94f7e90d4c1.png [1340828-20181016200254143-2063868001.png]: /images/20210726/e1e155510ec848deac614ee060e35f76.png
相关 装饰器 装饰器 定义: 用来装饰的工具 在不改变源代码及调用方式的基础上额外增加新的功能 开放封闭原则: 扩展是开放的(增加新功能) 修改源码是封闭的(修改已经实现 柔光的暖阳◎/ 2023年10月10日 10:16/ 0 赞/ 60 阅读
相关 装饰器 [https://www.cnblogs.com/cicaday/p/python-decorator.html][https_www.cnblogs.com_cicaday_ ╰半橙微兮°/ 2023年01月06日 01:24/ 0 赞/ 142 阅读
相关 【python】闭包和装饰器、通用装饰器、多个装饰器、带参装饰器、类装饰器 1、闭包 概念: 把使用了外部函数变量的内部函数称为闭包 构成闭包的三个条件: 在函数嵌套的基础上(在外部函数内定义一个内部函数) 内部函数使用外部函数变 - 日理万妓/ 2022年11月28日 13:44/ 0 赞/ 253 阅读
相关 装饰器 装饰器 装饰模式有很多经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的。 装饰器 ╰+攻爆jí腚メ/ 2022年06月07日 11:58/ 0 赞/ 245 阅读
相关 装饰器 以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这 港控/mmm°/ 2022年05月28日 13:27/ 0 赞/ 252 阅读
相关 装饰器 装饰器 如果我们要增强函数的功能,但又不希望修改`原`函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator); 本质上,de 墨蓝/ 2021年12月14日 14:17/ 0 赞/ 263 阅读
相关 装饰器 目录 普通装饰器 带参数的装饰器 多个装饰器装饰一个函数 装饰器的修复技术 装饰器 :在不改变原函数的代号和调用方法的基础上, 给原函数额外增加功能 女爷i/ 2021年10月29日 16:26/ 0 赞/ 377 阅读
相关 装饰器 装饰器的固定模式 def warpper(f): def inner(args,kwargs): print("WDNMD") 我就是我/ 2021年10月29日 07:12/ 0 赞/ 503 阅读
相关 装饰器 定义: 器字代表函数,装饰器本质是函数;装饰:装饰其他函数,就是为其他函数添加附加功能 原则: 1.不能修改被装饰函数的源代码(在不修改被装饰函数源代码的情况下为 心已赠人/ 2021年09月20日 12:00/ 0 赞/ 389 阅读
还没有评论,来说两句吧...