Python学习 :装饰器
装饰器(函数)
装饰器作为一个函数,可以为其他函数在不修改原函数代码的前提下添加新的功能
装饰器的返回值是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等。
装饰器,可以让我们抽离出大量与函数功能本身无关的相同代码并在装饰器函数中使用
装饰器的三个重要要素:
一、作用域
二、高阶函数
三、闭包
一、作用域
在上一节的函数中,我们详细介绍了函数的4种作用域:
L.local,局部作用域;E.enclosing,嵌套作用域;G.global,全局作用域;B.built-in,内建作用域
作用域的优先搜索顺序:局部作用域>>外层嵌套作用域>>当前模块(嵌套函数中)的全局作用域>>python内置作用域;
二、高阶函数
把函数作为参数传入,即函数本身也可以作为一个变量,这样的函数称为高阶函数
高阶函数,就是为了让函数的参数能够接收到别的函数
三、闭包
闭包函数可以脱离函数,在函数的外部单独地进行调用
闭包 = 内部函数 + 定义函数时的环境
闭包的两个条件:1、拥有内部函数;2、对外部环境的一个变量进行引用
def outer():
x = 'Hello World!' #定义函数的变量(环境) def inner(): #条件1,,inner是内部函数
print(x) #条件2,对外部环境的一个变量进行引用 return inner #结论,内部函数inner就是一个闭包 f = outer()
f()
>>> Hello World!
装饰器
Eg1.计算总用时的装饰器
import time def show_time(f):
def inner():
start = time.time()
f()
end = time.time()
res = end - start
print('总用时:',res)
return inner @show_time #效果相当于 func1=show_time(func1)
def func1():
print('-----------功能1-----------')
time.sleep(2) # 延时2s @show_time #效果相当于 func2=show_time(func2)
def func2():
print('-----------功能2-----------')
time.sleep(3) # 延时3s func1()
func2()
>>>-----------功能1-----------
总用时: 2.0070815086364746
-----------功能2-----------
总用时: 3.0007598400115967
Eg2.带参数的装饰器(如果被装饰的函数中有参数,则装饰器函数中也要带上参数)
import time
def show_time(f):
def inner(*args,**kwargs):
start = time.time()
f(*args,**kwargs)
end = time.time()
res = end - start
print('总用时:',res)
return inner @show_time #效果相当于 func1=show_time(func1)
def func3(*args,**kwargs):
sums = 0
for i in args:
sums += i
print('-----------加法器-----------')
print('结果是:',sums) func3(5,6,1,4)
>>>-----------加法器-----------
结果是: 16
总用时: 0.0
Eg3.带参数的装饰器(参数为设置的条件,判断是否需要执行修饰器)
import time
def flag(flag = 'False'):
def show_time(f):
def inner(*args,**kwargs):
if flag == 'True':
start = time.time()
f(*args,**kwargs)
end = time.time()
print('time: %s'%(end-start))
else:
f(*args, **kwargs)
return inner
return show_time @flag('True') # flag = 'True',运行总用时装饰器
def add(*args,**kwargs):
sum = 0
for i in args:
sum+=i
print('-----add的运行结果-----')
print(sum)
time.sleep(1) @flag('False') # flag = 'False',不运行总用时装饰器
def add1(*args,**kwargs):
sum = 0
for i in args:
sum+=i
print('-----add1的运行结果-----')
print(sum)
time.sleep(1) add(1,4)
add1(1,4)
>>> -----add的运行结果-----
5
time: 1.0008649826049805
-----add1的运行结果-----
5
注意:
- 我们在调用装饰器时,提供了其它参数,@flag()默认的参数为False,则不会输出总用时装饰器;
- 当@flag()参数为True时,输出总用时。这样是在原有的装饰器上加了一层判断;
- 当我们使用@flag(‘True’)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中;
Python学习 :装饰器的更多相关文章
- Python学习---装饰器/迭代器/生成器的学习【all】
Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210
- Python学习---装饰器的学习1210
装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包 [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...
- python学习---装饰器
什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数 ...
- python学习——装饰器函数
一.装饰器函数的作用是什么 答:装饰器函数是在不修改原函数及其调用方式的情况下对原函数功能进行扩展 对于搞python开发的人来说,函数占据了至关重要的地位.都说学好函数你就可以去找工作了,好了,假如 ...
- Python学习——装饰器/decorator/语法糖
装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...
- day12 python学习 装饰器
闭包函数: 内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数#函数内部定义的函数称为内部函数 闭包函数获取网络应用 from urllib.request import url ...
- python之循序渐进学习装饰器
python装饰器的定义:在代码运行期间在不改变原函数定义的基础上,动态给该函数增加功能的方式称之为装饰器(Decorator) 装饰器的优点和用途: 1. 抽离出大量函数中与函数功能本身无关的的雷同 ...
- python基础 (装饰器,内置函数)
https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...
- python初级装饰器编写
最近项目太忙好久没有学习python了,今天更新一下吧~~ 1.什么是python装饰器: 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返 ...
- Python之装饰器、迭代器和生成器
在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...
随机推荐
- mongodb 3.4复制集详解
1关闭数据库,打开三个mongodb数据库数据库实例 rs.printReplicationInfo() 2:原理 主库能够进行读写操作,一个复制集群只能有一个活跃的主库 一般情况下复制可以分为好几种 ...
- Oracle案例04——ORA-39700: database must be opened with UPGRADE option
Oracle11.2.0.3数据库通过rman备份到Oracle11.2.0.4上做还原,报需要升级的错误,具体处理步骤如下: 一.错误信息 SQL> alter database open r ...
- 阿里云OSS 上传文件SDK
Aliyun OSS SDK for C# 上传文件 另外:查找的其他实现C#上传文件功能例子: 1.WPF用流的方式上传/显示/下载图片文件(保存在数据库) (文末有案例下载链接) 2.WPF中利用 ...
- nginx的开机自启、server命令启动、nginx.conf配置
1.将Nginx设置为开机自动启动 a.当上面6步完成之后,说明安装已经完全成功了,但是每次开机我们面临的一个问题,就是每次都要执行命令(1: cd /usr/local/nginx/sbin/ ...
- centos7下搭建sphinx全文检索引擎
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索.Sphinx特别为一些 ...
- 实验5&期中考试后两题
实验内容1: #include <iostream> #include <vector> #include <string> using namespace std ...
- 如何给SAP C4C的产品主数据division配置出新的下拉选项
如图:C4C产品主数据division字段默认的下拉菜单选项: 切换成调试模式,找到UI这个字段绑定的模型字段名称:/Root/MaterialDivision: 再找到这个UI模型字段绑定到的cor ...
- SQLi-db 批量注入工具+教程
这款工具在中国还没人发.所以我发来给大家玩玩:顺便带了教程. 关键字:inurl:article.asp?id= inurl:article.php?id=inurl:article.jsp?id=( ...
- hive 的一个小问题
hive查询语句中如果包含中文,如like '%奥巴马%' ,并且所查hive表中的数据是utf-8的,可能会查不出正确结果. 原因可能是系统环境的LANG 设置不是utf-8,需要把环境变量LANG ...
- poj3259 Wormholes【Bellman-Ford或 SPFA判断是否有负环 】
题目链接:poj3259 Wormholes 题意:虫洞问题,有n个点,m条边为双向,还有w个虫洞(虫洞为单向,并且通过时间为倒流,即为负数),问你从任意某点走,能否穿越到之前. 贴个SPFA代码: ...