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/ ...
随机推荐
- UVA-11987
I hope you know the beautiful Union-Find structure. In this problem, you're to implement somethingsi ...
- Python学习笔记之二——Python的运行机制,一般人肯定不会
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:XX Python解释器简介 解释器是一种让其他程序运行起来的程 ...
- ARTS-S EN0001-In tech race with China, US universities may lose a vital edge
原文 The U.S. is still out in front of global rivals when it comes to innovation, but American univers ...
- JsonClassGenerAtor 使用json字符串生成对象
https://pan.baidu.com/s/1Mz1xB6L3blqrRiRAMuJpIg 链接
- cs5642 v3摄像头拍照效果
4个摄像头拍照效果 配置的是ov5642_960p_RAW 测试图片分别如下:
- Lua-Async 协程的高级用法
Lua-Async 这是一个基于协程的异步调用库, 该库的设计思路类似JavaScript的Promise, 但相比Promise, 它有更多的灵活性. -- 引入Async local Async ...
- 16个Spring注解,你知道的有几个?
@Controller 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象. @RestController Spring4之后加入的注解,原来在@Co ...
- 在 ASP.NET Core 中使用 AutoMapper 使 Entity 和 Resource 之间进行映射
目录 从 NuGet 安装 AutoMapper 添加 Entity类 和 Resource类 添加一个 Profile文件,配置映射关系 在Startup中对AutoMapper进行注册 在项目中使 ...
- python基础知识第四篇(元组)
元组 list列表 li[11,22,33,44]列表和元组的区别:元素不可被修改,不可被增加或者删除(一级元素),列表则相反 tuple元组 tu=(111,222,333,444) 支持索引取值 ...
- VS2019 开发Django(一)------环境配置
导航:VS2019开发Django系列 缘起:学习是我一直在做的一件事情,但是,可怕的是不知道学习什么,然后止步不前,安于现状,曾经很长的一段时间,我是不知道学习什么,工作上的事情,其实是相对固定的, ...