装饰器(函数)

装饰器作为一个函数,可以为其他函数在不修改原函数代码的前提下添加新的功能

装饰器的返回值是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等。

装饰器,可以让我们抽离出大量与函数功能本身无关的相同代码并在装饰器函数中使用

装饰器的三个重要要素:

一、作用域

二、高阶函数

三、闭包

一、作用域

在上一节的函数中,我们详细介绍了函数的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学习 :装饰器的更多相关文章

  1. Python学习---装饰器/迭代器/生成器的学习【all】

    Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210

  2. Python学习---装饰器的学习1210

    装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包  [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...

  3. python学习---装饰器

    什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数 ...

  4. python学习——装饰器函数

    一.装饰器函数的作用是什么 答:装饰器函数是在不修改原函数及其调用方式的情况下对原函数功能进行扩展 对于搞python开发的人来说,函数占据了至关重要的地位.都说学好函数你就可以去找工作了,好了,假如 ...

  5. Python学习——装饰器/decorator/语法糖

    装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...

  6. day12 python学习 装饰器

    闭包函数: 内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数#函数内部定义的函数称为内部函数 闭包函数获取网络应用 from urllib.request import url ...

  7. python之循序渐进学习装饰器

    python装饰器的定义:在代码运行期间在不改变原函数定义的基础上,动态给该函数增加功能的方式称之为装饰器(Decorator) 装饰器的优点和用途: 1. 抽离出大量函数中与函数功能本身无关的的雷同 ...

  8. python基础 (装饰器,内置函数)

    https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...

  9. python初级装饰器编写

    最近项目太忙好久没有学习python了,今天更新一下吧~~ 1.什么是python装饰器: 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返 ...

  10. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

随机推荐

  1. pt-index-usage

    pt-index-usage能够从日志当中分析索引的使用情况,并且生成一个报表.下面看一下基本的语法: pt-index-usage [OPTIONS] [FIILE] 打印报告: pt-index- ...

  2. 在Server2012R2上导入Server2008R2的HyperV虚拟机

    Importing Windows 2008 R2 Hyper-V VM Into Windows 8.1 For the purposes of this post, let’s try and i ...

  3. TaskScheduler内幕天机解密:Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详解等

    本课主题 通过 Spark-shell 窥探程序运行时的状况 TaskScheduler 与 SchedulerBackend 之间的关系 FIFO 与 FAIR 两种调度模式彻底解密 Task 数据 ...

  4. 如何控制table中td内的文本位置

    默认为左中效果    td中垂直用valign 取值为:top/middle/bottom/baseline,水平用align 取值为:left,center,right;

  5. 使用Vue-cli脚手架

    使用vue-cli脚手架开发vue项目,有以下好处: (1)成熟的Vue项目架构设计. (2)本地测试服务器(热更新). (3)集成打包上线方案. Vue-cli系统要求: Node.js(>= ...

  6. UVa 12265 - Selling Land

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. ajax 三级联动商品分类(转载)

    转载  自  jines     http://www.cnblogs.com/lijinblogs/p/5759399.html 思路分析:效果:当页面加载时,利用ajax异步向后台请求数据,加载一 ...

  8. webpack-cli解决办法

    错误信息:Error Cannot find module 'webpack-cli 出现这个错误的原因是因为只全局安装了webpack,没有安装对应的webpack-cli.再打包时是需要webpa ...

  9. 使用libcurl下载文件小例

    libcurl是一个很强大的开源网络处理库,支持包括HTTP.HTTPS.FTP……一系列网络协议.用它来进行HTTP的get\post 或者下载文件更是小菜一碟,chrome内核都用到了它,本文主要 ...

  10. mysql.sock问题

    Can't connect to local MySQL server through socket '/tmp/mysql.sock' 上述提示可能在启动mysql时遇到,即在/tmp/mysql. ...