博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之路《八》装饰器
阅读量:4986 次
发布时间:2019-06-12

本文共 2588 字,大约阅读时间需要 8 分钟。

我在学习python的时候老师和我说的第一句话就是

装饰器是个好东西啊

那么装饰器是个什么样的东西呢,他又能做些什么呢?

1.为什么装饰器

当我们一个程序已经构建完成,并且已经发布出去了,但是现在需要增加一个活动,那么我们如何去做呢?

看一下下面的例子

1 def sai_hi():2     print('hi')3 4 def text(func):5     print('活动开始')6     func()7     print('活动结束')8 text(sai_hi)

答案是这样

活动开始hi活动结束

我们看到我们已经为这个sai_hi的活动增加了一个开始和结束的功能

但是还是不够完美

源代码在发布出去之后是不能随意修改的 ,因为一但修改源代码可能导致非常多的bug出现,越改越多

所以我们需要在不该边源代码的基础上为目标增加更能怎么做呢?

1 def text(func): 2     def text1(): 3         print("活动开始") 4         func() 5         print("后的结束") 6     return text 7  8 @text # 那么这个@text的意思就是 sai_hi=text(sai_hi) 9 def sai_hi():10     print('hi')11 12 sai_hi()

那么只需要这样就给函数安全的加上供能啦

那么当我们大函数需要传入参数呢?

1 def timer(func): 2     def deco(*args,**kwargs): 3         satr_time = time.time() 4         func(*args,**kwargs) 5         stop_time = time.time() 6         print('the  run time is %s' % (stop_time - satr_time)) 7     return deco 8 @timer# text1=timer(text1) 9 def text1():10     time.sleep(2)11     print('in the text1')12 @timer13 def text2(name):   # ------------------------------------------------------------------------------------往里面传值14     time.sleep(3)15     print('in the text2:',name)16 17 text1()18 text2('miki')

是不是只需要都在第二阶里面加上参数就可以了?

那么还有更高级的用法哦

这样想 当我们非常的的模块 现在其中有几个模块为了安全现在需要登录验证,然而有些却不要

或者是我现在要验证,可能过几天要向非会员什么的免费开放几天。这个时候问题来了

在不该边源代码的情况下怎么做?我们的装饰器最高阶版就可以完成这项工作

1 name,password='miki','abc123' 2 def foo(auth_type): 3     print("the foo",auth_type) 4     def math(func): 5         print("in the math") 6         def deco(*args,**kwargs): 7             if(auth_type=='local'): 8                 usename=input('your name:').strip() 9                 usepassword=input('your password:').strip()10                 if(name==usename and password==usepassword):11                     print('\033[31;1m you success \033[0m')12                     res = func(*args,**kwargs)13                     return res # -----------------------------------原本装饰后使得func的返回值没有了 这里使得返回值出现14                 else:15                     print('\033[31;1m username or password error \033[0m')16             elif(auth_type=='ldap'):17                 res = func(*args, **kwargs)18                 return res19         return deco20     return math21 def index():22     print('welcome to indext page')23 @foo(auth_type='local')  # home =foo(home)24 def home(miki):25     print('welcome to home page',name,miki)26     return ' form home'27 @foo(auth_type='ldap')28 def bbs():29     print('welcome to bbs page')30 index()31 miki=input('your age:')32 home(miki)33 bbs()

那么此时的foo里面传入的参数可以提供验证,当验证通过则免登录。

程序可以自行理解一下

转载于:https://www.cnblogs.com/BookMiki/p/9679681.html

你可能感兴趣的文章
关于nginx反向代理504 gateway time-out配置
查看>>
带有构造方法的枚举
查看>>
idea代码出现Usage of API documented as @since 1.8+ less... (Ctrl+F1)
查看>>
Quartz.NET 2.0 学习笔记(2) :和1.0的几点不同
查看>>
ext4 goes faster than ext3(From 51cto)
查看>>
初识WEB移动端开发
查看>>
关于<meta name="viewport" content="width=device-width, initial-scale=1.0">的解释
查看>>
浪味仙
查看>>
LUOGU P4777 【模板】扩展中国剩余定理(EXCRT)
查看>>
[转]expect的安装
查看>>
HDU 1070 [Milk] 贪心
查看>>
关于 IsLocalUrl 方法的注意事项
查看>>
ln -s 软连接介绍
查看>>
计算到今天多少天--字符集要选GB2312
查看>>
《Python数据分析与挖掘实战》-第四章-数据预处理
查看>>
觉得父母思想过时,有时甚至阻碍到自己,如何有效沟通并说服?
查看>>
P3480 [POI2009]KAM-Pebbles 阶梯NIM
查看>>
STM32之CAN ---CAN ID过滤器分析
查看>>
android studio ndk 调试
查看>>
ylb-ASP.NET技术搭建不错的网站列表
查看>>