**装饰器**

- [ ] 装饰器和闭包有很大的联系。有时你需要在不改变源代码的情况下修改已经存在的函数。装饰器的运用可以提高效率,减少重复的代码。
- [ ] 装饰器的实质是一个函数。它把一个函数作为输入并且返回另一个函数。

在装饰器中,通常使用下面这些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)--装饰器的更多相关文章

  1. python基础学习1-双层装饰器(实现登陆注册)

    LOGIN_USER = {"IsLogin":False} def check_login(func): #检查登陆的装饰器 def inner(*args,**kwargs): ...

  2. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  3. 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)-补充: 作用域 & 装饰器 1 ● Python的作用域补遗 在C/C++等语言中, if语句等控制结构(control structure)会产生新的作用域 ...

  4. Python学习笔记:装饰器

    Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...

  5. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

  6. Python基础(八)装饰器

    今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f ...

  7. python3 速查参考- python基础 7 -> 函数编程之 装饰器、生成器

    装饰器 1.速查笔记 #-- 函数装饰器:是它后边的函数的运行时的声明 由@符号以及后边紧跟的"元函数"(metafunction)组成 @staticmethod def sme ...

  8. Python学习笔记012——装饰器

    1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...

  9. python学习笔记之装饰器、递归、算法(第四天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

随机推荐

  1. [TimLinux] Python 函数

    1. 函数(function)与方法(method)的区别 方法:在类结构体中通过def语句声明的代码块称为方法,比如类方法(classmethod),实例方法,静态方法(staticmethod)等 ...

  2. 自然语言处理(NLP) - 数学基础(1) - 排列组合

    正如我在<自然语言处理(NLP) - 数学基础(1) - 总述>一文中所提到的NLP所关联的概率论(Probability Theory)知识点是如此的多, 饭只能一口一口地吃了, 我们先 ...

  3. ruby 构建API接口流程代码

    来源:https://ruby-china.org/topics/25822 1.创建新项目 rails new api_demo 2.生成控制器: # 我们不需要生成资源文件 $ bundle ex ...

  4. 【集合系列】- 深入浅出分析 ArrayDeque

    一.摘要 在 jdk1.5 中,新增了 Queue 接口,代表一种队列集合的实现,咱们继续来聊聊 java 集合体系中的 Queue 接口. Queue 接口是由大名鼎鼎的 Doug Lea 创建,中 ...

  5. 【Git】学习开始

    [Git]学习开始 转载:https://www.cnblogs.com/yangchongxing/p/10172683.html 在线电子书籍:https://git-scm.com/book/z ...

  6. 201871010119-帖佼佼《面向对象程序设计(java)》第二周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>     https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ...

  7. java8新特性 - 什么是函数式接口 @FunctionalInterface?

    什么是函数式接口 @FunctionalInterface 源码定义 /** * An informative annotation type used to indicate that an int ...

  8. 搭建rsync+inotify实现实时备份

    一.环境搭建说明 系统环境 CentOS7.5 备份节点 主机名:backup01 IP地址:172.16.2.41 数据节点 主机名:nfs-master IP地址:172.16.2.31 二.在备 ...

  9. Caffe源码-SyncedMemory类

    SyncedMemory类简介 最近在阅读caffe源码,代码来自BVLC/caffe,基本是参照网络上比较推荐的 Blob-->Layer-->Net-->Solver 的顺序来分 ...

  10. 云服务器配置 docker java mysql mongodb redis nginx 环境

    磁盘挂载 fdisk -l #查看磁盘列表 mkfs.ext4 /dev/vdb #格式化磁盘 mount /dev/vdb /data #挂载磁盘在/data echo '/dev/vdb /dat ...