1.1装饰器(decorator)

什么是装饰器:

器即函数

1.装饰器可以理解为给一个函数,做修饰,而不修改函数本身。

2.装饰器定义:本质就是函数,decorator功能就是为其他函数添加新的功能。

装饰器的的原则

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

装饰器的前提原则:不能修改被装饰函数的源代码,和函数的调用方式

1.1.1高阶函数

高阶函数定义:

1.函数接收的参数是一个函数名。

2.函数的返回值是一个函数。

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

1.1.2函数嵌套

函数嵌套

python语言中的嵌套:定义一个函数的时候,函数体还能定义另一个函数。

在其他语言(例c语言),在一个函数调用另一个函数,叫嵌套

1.1.3闭包

存储在子封闭作用域(函数)的行为叫做闭包

一个闭包就是一个函数,只不过函数内部带上了一个额外的变量。

闭包关键特点就是它会记住自已被定义时的环境

1.2一步一步理解装饰器

1 defgo():2 print("python")3 #该函数功能执行go() ,显示出python

4 go()

现在我们要增强go()这个自定义函数的功能,比如在函数调用前自动打印出python是什么样的语言,但有不想在修改go()函数,这种在代码运行期间动态为其添加功能,就称之为装饰器(decorator)

1 defdeco(func):2 defwrapper():3func()4 print("一个高级语言")5 returnwrapper6@deco7 defgo():8 print("python")9go()10 #结果

11python12一个高级语言13

14 #现在才相当于一个合格的装饰器

15

16 把@deco放到go()函数的定义处,相当于执行了go=deco(go)

上面deco()是一个装饰器,返回一个函数,所以原来的go()函数仍然存在,

只是现在同名的go变量指向了新的函数,于是调用go()函数将执行新函数,

即在go()函数中返回的wrapper()函数

2.给被装饰器函数加参数和返回值

1 defdeco(func):2 def wrapper(*args,**kwargs):3 res = func(*args,**kwargs) #这里就相当于闭包

4 print("一门高级语言")5 returnres6 returnwrapper7

8@deco9 defgo(x,y):10 print("python",x,y)11 return "done"

12 go(3,5)13 #结果

14python15一个高级语言16

17 #为什么要给装饰器加参数,如果被装饰的函数里面有参数,我们的装饰器是不是器也要加相应的参数,

18 我们的装饰器为什么要给wrapper(*args,**kwargs) func(*args,**kwargs),可接收任意参数,因为我们被装饰的函数可能都是不同的的参数,而这个装饰器,需要给很多函数做装饰,但是很多函数的参数,功能都是不一样的,因此我们定义装饰器 的函数参数应该是加可变长参数19

20 #为什么给装饰里面加返回值

21 我们被装饰的函数,一般是有返回值,而执行装饰器(@decorator) 所以需要给wrapper 加上返回值来return fun()的执行结果,来保持被装饰的函数的一致性。

3.给装饰器加参数

如果装饰器本身需要传入参数,那就需要编写一个返回装饰器的高阶函数,也就是在原来装饰器上,做闭包处理,在加上一层函数。

def auth_book(auth=None):2 print(auth)3 defdeco(func):4 def wrapper(*args,**kwargs):5 res = func(*args,**kwargs) #这里就相当于闭包

6 print("一门高级语言")7 returnres8 returnwrapper9 returndeco10 @deco("book") #装饰器加参数 跟go=deco("book")(go)类似

11 defgo(x,y):12 print("python",x,y)13 go(3,5)

3层嵌套的装饰器的效果是这样的

go=auth_book("book")(go)

user_list=[2 {'name':'yj','passwd':'123'},3 {'name':'xixi','passwd':'123'},4 {'name':'xiha','passwd':'123'},5 {'name':'lala','passwd':'123'},6]7

8 current_user={'username':None,'login':False}9 def auth(auth_type='file'):10 defauth_deco(func):11 def wrapper(*args,**kwargs):12 if auth_type == 'file':13 if current_user['username'] and current_user['login']:14 res=func(*args,**kwargs)15 returnres16 username=input('用户名:').strip()17 passwd=input('密码:').strip()18

19 for index,user_dic inenumerate(user_list):20 if username == user_dic['name'] and passwd == user_dic['passwd']:21 current_user['username']=username22 current_user['login']=True23 res=func(*args,**kwargs)24 returnres25

26 else:27 print('用户名或者密码错误,重新登录')28 elif auth_type == 'ldap':29 print('巴拉巴拉小魔仙')30 res=func(*args,**kwargs)31 returnres32 returnwrapper33 returnauth_deco34

35

36 #auth(auth_type='file')就是在运行一个函数,然后返回auth_deco,所以@auth(auth_type='file')

37 #就相当于@auth_deco,只不过现在,我们的auth_deco作为一个闭包的应用,外层的包auth给它留了一个auth_type='file'参数

38 @auth(auth_type='ldap')39 defindex():40 print('欢迎来到主页面')41

42 @auth(auth_type='ldap')43 defhome():44 print('这里是你家')45 @auth(auth_type="file")46 defshopping_car():47 print('查看购物车啊亲')48

49 deforder():50 print('查看订单啊亲')51

52 #print(user_list)

53index()54 #print(user_list)

55home()56 shopping_car()

python decorator wrapper_python装饰器(decorator)相关推荐

  1. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x):return ...

  2. python decorator. decorator_Python 装饰器Decorator(一)

    (一) 装饰器基础知识 什么是Python装饰器?Python里装饰器是一个可调用的对象(函数),其参数是另一个函数(被装饰的函数) 假如有一个名字为somedecorator的装饰器,target是 ...

  3. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  4. python装饰器-理解Python装饰器(Decorator)

    理解Python装饰器(Decorator) Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程. 想要理解Python中的装饰器,不得不先理解闭包(clo ...

  5. 如何使用python装饰器_Python学习之如何使用装饰器 @decorator

    建议大家在看这篇文章之前还是点击上面这篇文章看一下,先了解一下什么是装饰器之后再看. 猿人学python之我的学习笔记分享:如何使用装饰器 @decorator 上面代码中使用装饰器的方法看起来有点复 ...

  6. python描述器descriptor_python装饰器decorator、描述器descriptor

    背景 image.png 装饰器decorator 返回值为另一函数的函数,通常使用 @wrapper语法. 装饰器的常见例子包括 装饰器语法只是一种语法快捷方式,以下两个函数定义在语义上完全等价: ...

  7. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了

    参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...

  8. Python的装饰器decorator

    Python的装饰器decorator 作者:王大为 时间:2016-10-19 一.装饰器的本质 本质:装饰器本身就是一个函数,高阶函数+嵌套函数==>装饰器 原则: * 1.不能修改被装饰函 ...

  9. Get技能---Python 装饰器Decorator

    Get技能---Python 装饰器Decorator Python装饰器 装饰器概述 从需求引入装饰器 监控一段代码执行时间,最原始的实现 监控一段代码执行时间,以函数传参的形式实现 监控一段代码执 ...

最新文章

  1. php设计模式 - 建造者模式
  2. javascript学习笔记2
  3. javascript:12种JavaScript MVC框架之比较
  4. jquery操作iframe
  5. ARC中block块作为属性的使用笔记
  6. 解读设计模式----简单工厂模式(SimpleFactory Pattern),你要什么我就给你什么
  7. 华为python有必要学吗_【华为云技术分享】这个 Python 库有必要好好学学
  8. [流体输配管网] 使用 Matlab 绘制莫迪图
  9. 首页静态生成 错误:客户端发现响应内容类型为“text/html”,但应该是“text/xml”...
  10. android flash游戏播放器代码,新flashplayer游戏播放器apk-新Flash游戏播放器(NEW Server Mode)预约V4.2安卓版-西西软件园...
  11. vue实现导出excel
  12. 高考方向计算机基础试题题库,计算机基础考试题库 计算机基础考试题库(含答案).doc...
  13. 图像Randon变换含Matlab源码
  14. 中科大自主招生2018笔试数学之三
  15. 【VBA】VBA定时运行程序
  16. GAMES101复习:光线追踪(Ray Tracing)
  17. 地狱已满服务器搭建教程-1 服务器安装篇 NMRIH Dedicate Server
  18. 微软必应壁纸spotlight锁屏壁纸获取
  19. 大一微积分笔记整理_大一微积分知识点总结
  20. 小米5s Plus安装类原生系统

热门文章

  1. SD-WAN大势已来,网银互联被低估了吗?
  2. Java正则表达式之分组和替换
  3. 搜索引擎优化-黑帽技术
  4. React Native之ScrollView控件详解
  5. oracle11g服务器端卸载,Oracle11G卸载教程
  6. matlab仿真超声波测距,汽车倒车雷达的Simulink仿真测试
  7. Beef在kali系统中安装出现问题如何解决
  8. PhpMyadmin利用源代码及root账号泄露漏洞秒获系统权限
  9. Linux下chrony授时监测脚本
  10. 艾美捷CpG ODN系列——ODN 2006 (TLRGRADE)说明