python 基础学习笔记(8)--装饰器
**装饰器**
- [ ] 装饰器和闭包有很大的联系。有时你需要在不改变源代码的情况下修改已经存在的函数。装饰器的运用可以提高效率,减少重复的代码。
 - [ ] 装饰器的实质是一个函数。它把一个函数作为输入并且返回另一个函数。
在装饰器中,通常使用下面这些python技巧:
1.*args 和 **kwargs
2.闭包
3.作为参数的函数
例
函数 document_it() 定义了一个装饰器,会实现如下的功能:
 - [ ] 打印输出函数的名字和参数的值
 - [ ] 执行含有参数的函数
 - [ ] 打印输出的结果
 - [ ] 返回修改后的函数
```
     def document_it(func):
	         def new_fuction(*args, **kwargs):
	             print('Running fuction:',func,_name_)     
	             print('positional arguments:',args)
	             print('keyword arguments',kwargs)
	             result = func(*args, **kwargs)
	             print('result:',result)
	             return result
	         return new_fuction
```
无论传入 document_it() 的函数 func 是什么,装饰器都会返回一个新的函数,其中包含函数 document_it() 增加的额外语句。实际上,装饰器并不需要执行函数 func 中的代码,只是在结束前函数 document_it() 调用函数 func 以便得到 func 的返结果和附加代码的结果。
**那么如何使用装饰器呢?**
- [ ] 人工赋值
```
	     def document_it(func):  #装饰器
	         def new_fuction(*args, **kwargs):
	             print('Running fuction:',func)
	             print('positional arguments:',args)
	             print('keyword arguments',kwargs)
	             result = func(*args, **kwargs)
	             print('result:',result)
	             return result
	         return new_fuction
	     def add_ints(a,b):  #被装饰函数
	         return a+b
	     cooler_add_ints = document_it(add_ints)  #人工对装饰器赋值
	     cooler_add_ints(3,5)
	     ####################################
	     结果
	     Running fuction: <function add_ints at 0x000001EAECBF9950>
	     positional arguments: (3, 5)
	     keyword arguments {}
	     result: 8
```
- [ ] 直接赋值(在要装饰的函数前添加装饰器的名字 例 @decorator_name)
```
	     def document_it(func):  #装饰器
	         def new_fuction(*args, **kwargs):
     print('Running fuction:',func)
	             print('positional arguments:',args)
	             print('keyword arguments',kwargs)
	             result = func(*args, **kwargs)
	             print('result:',result)
	             return result
	         return new_fuction
	     @document_it
	     def add_ints(a,b):  #被装饰函数
	         return a+b
	     add_ints(3,5)
	###################################
	     结果
	     Running fuction: <function add_ints at 0x000001F47DB89AE8>
	     positional arguments: (3, 5)
	     keyword arguments {}
	     result: 8
```
同样一个函数可以有多个装饰器。
下面我们写一个对结果求平法的装饰器 square_it ():
```
	def document_it(func):  #装饰器
	    def new_fuction(*args, **kwargs):
	        print('Running fuction:',func)
	        print('positional arguments:',args)
	        print('keyword arguments',kwargs)
	        result = func(*args, **kwargs)
	        print('result:',result)
	        return result
	    return new_fuction
	def square_it(func):
	    def new_function(*args,**kwargs):
	        result = func(*args,**kwargs)
	        return  result * result
	    return new_function
	@document_it
	@square_it
	def add_ints(a,b):  #被装饰函数
	    return a + b
	add_ints(3,5)
	############################结果
	Running fuction: <function square_it.<locals>.new_function at 0x000001E63B199EA0>
	positional arguments: (3, 5)
	keyword arguments {}
	result: 64
```
靠近函数定义 (def上面) 的装饰器最先执行,然后依次执行上面的,任何顺序都会得到相同的结果。
```
	def document_it(func):  #装饰器
	    def new_fuction(*args, **kwargs):
	        print('Running fuction:',func)
	        print('positional arguments:',args)
	        print('keyword arguments',kwargs)
	        result = func(*args, **kwargs)
	        print('result:',result)
	        return result
	    return new_fuction
	def square_it(func):
	    def new_function(*args,**kwargs):
	        result = func(*args,**kwargs)
	        return  result * result
	    return new_function
	@square_it
	@document_it      ###交换后
	def add_ints(a,b):  #被装饰函数
	    return a + b
	add_ints(3,5)
	######################结果
	Running fuction: <function add_ints at 0x000001FD5D859D08>
	positional arguments: (3, 5)
	keyword arguments {}
	result: 8
```
python 基础学习笔记(8)--装饰器的更多相关文章
- python基础学习1-双层装饰器(实现登陆注册)
		
LOGIN_USER = {"IsLogin":False} def check_login(func): #检查登陆的装饰器 def inner(*args,**kwargs): ...
 - 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
		
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
 - 十一. Python基础(11)—补充: 作用域 & 装饰器
		
十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...
 - Python学习笔记:装饰器
		
Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...
 - python基础整理4——面向对象装饰器惰性器及高级模块
		
面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...
 - Python基础(八)装饰器
		
今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...
 - python3 速查参考- python基础 7 -> 函数编程之 装饰器、生成器
		
装饰器 1.速查笔记 #-- 函数装饰器:是它后边的函数的运行时的声明 由@符号以及后边紧跟的"元函数"(metafunction)组成 @staticmethod def sme ...
 - Python学习笔记012——装饰器
		
1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...
 - python学习笔记之装饰器、递归、算法(第四天)
		
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
 
随机推荐
- MongoDB第三天(正则,管道,聚合,字符串,算术,日期,java连接MongoDB)
			
部分正则表达式: i:忽略大小写 m:多行查找 x:设置 x 选项后,正则表达式中的非转义的空白字符将被忽略. s:允许点字符(即.)匹配包括换行符在内的所有字符. w:匹配包括下划线的任何单词字 ...
 - Python基础第二课
			
字符串(引号):四种表达方式 n1 = "我是" n1 = '我是' n1 = """我是""" n1 = '" ...
 - 使用chole创建一个连接池
			
using Chloe; using Chloe.Infrastructure; using Chloe.SqlServer; using System; using System.Collectio ...
 - 基于CC1606  FPGA评估板移植iCamera程序小结
			
iCamera作为柴草电子经典的摄像头开发工具,其强大的摄像头调试功能,深受广大网友喜爱,支持市面上各种摄像头. 目前现有的应用板卡支持:CC1601(CP601A). CC1602(CP601B) ...
 - Selenium使用方法整理
			
我采用的是Python来使用selenium库,同时java也可以使用,但不如python操作起来方便.下文都会以python的操作为例子,整理我学习selenium过程中收集到的方法. 一:安装 首 ...
 - AJAX中的dataType
			
参考ajax的api文档 dataType的类型:String ajax中的dataType的属性: text:返回纯文本字符串 json:返回json数据 jsonp:jsonp格式(我没用过) h ...
 - C#线程学习笔记七:Task详细用法
			
一.Task类简介: Task类是在.NET Framework 4.0中提供的新功能,主要用于异步操作的控制.它比Thread和ThreadPool提供了更为强大的功能,并且更方便使用. Task和 ...
 - JS---动画函数封装:设置任意的一个元素,移动到指定的目标位置
			
动画函数封装:设置任意的一个元素,移动到指定的目标位置 <!DOCTYPE html> <html lang="en"> <head> < ...
 - RAID磁盘阵列介绍
			
磁盘阵列 RAID介绍 一.简介: 磁盘阵列(Redundant Arrays of Independent Drives,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意. 最初是由加利福尼亚 ...
 - 简单实用的git命令
			
1.下载项目 先进入目录然后使用jit $ git clone +"url" 2.项目配置 $ composer install 3.上传项目 $ git add . () $ g ...