一、装饰器基础

装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把他返回,或者将其替换成另一个函数或可调用对象。

eg:decorate装饰器

@decorate
def target():
print("Running target()") #上面写法等同于 def target():
print("Running target()")
target = decorate(target)

两种写法最终得出来的结果相同,但两个代码执行完毕得到的target不一定是原来那个target函数,而是被decorate(target)返回的函数。

1、装饰器通常把函数替换成另一个函数

def deco(func):
def inner():
print('Running inner()')
return inner #deco返回inner函数对象 @deco
def target(): #使用deco装饰target
print('Running target()') >>target() #运行target函数,调用被装饰的target其实会运行inner
Running inner() >>target #审查对象,发现target现在是inner的引用
<function deco.<locals>.inner at 0x10063b598>

装饰器只是一种语法糖,装饰器可以像常规的可调用对象一样调用,其参数是另一个函数。装饰器的一大特性是,能把被装饰的函数替换为其他函数,装饰器在加载模块时会立即执行。

二、何时执行装饰器

装饰器在被装饰的函数定义后会立即执行。

eg:registration.py模块

registry = []    #registry保存被@registry装饰的函数引用

def register(func):    #register的参数是一个函数
print("Running register(%s)" % func) #显示被装饰的函数
registry.append(func) #把func存入registry
return func #返回func:必须返回函数;这里返回的函数与通过参数传入的一样 @register #f1,f2被@register装饰
def f1():
print("Running f1()") @register
def f2():
print("Running f2()") def f3(): #f3没用被装饰
print("Running f3()") def main(): #main显示registry,然后调用f1()、f2()、f3()
print("Running main()")
print("Registry ->",registry)
f1()
f2()
f3() if __name__ == "__main__":
main() #只有把registration.py当作脚本运行时才调用main()

上述代码输出如下:

$python3 registration.py
Running register(<function f1 at 0x1000631bf8>)
Running register(<function f1 at 0x1000631c80>)
Running main()
registry -> [<function f1 at 0x1000631bf8> ,<function f1 at 0x1000631c80>]
Running f1()
Running f2()
Running f3()

加载模块后,register中有两个被装饰函数的引用:f1、f2。这两个函数,以f3,只有在main明确调用它们才执行。

如果导入registration.py模块(不作为脚本运行),输出如下:

import registration
Running register(<function f1 at 0x10063b1e0>)
Running register(<function f2 at 0x10063b237>)

函数装饰器在导入模块时立即执行,而被装饰函数只在明确调用时运行

Python装饰器基础及运行时间的更多相关文章

  1. 使用python装饰器计算函数运行时间的实例

    使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是 ...

  2. Python装饰器基础

    一.Python装饰器引入 讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个 ...

  3. python装饰器基础及应用

    一.简介 装饰器是是修改其它函数功能的函数:其意义是让其他函数在不修改任何代码的前提下增加额外功能 二.数据类型 首先我们来看一段简单的代码: from types import MethodType ...

  4. Python基础(五) python装饰器使用

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

  5. Python开发基础-Day7-闭包函数和装饰器基础

    补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...

  6. [python 基础]python装饰器(一)添加functools获取原函数信息以及functools.partial分析

    python装饰器学习的时候有两点需要注意一下 1,被装饰器装饰的函数取其func.__name__和func.func_doc的时候得到的不是被修饰函数的相关信息而是装饰器wrapper函数的doc ...

  7. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  8. python 装饰器 一篇就能讲清楚

    装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...

  9. Python 装饰器使用指南

    装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 1 装饰器基础知识 首先看一下这段代码 def deco(fn): print "I am %s!" % fn.__na ...

随机推荐

  1. 【Checkio Exercise】Probably Dice

    题目: Probably Dice Battle is full of randomnesses. You should observe randomness in a controlled sett ...

  2. sitecore 数字化营销-path funnel

    路径分析器是一个应用程序,允许您查看联系人在浏览网站时所采用的各种路径.您可以查看联系人在转换目标并与广告系列互动时所采用的路径,让您深入了解哪些路径为每次转化提供最佳参与价值,以及哪些路径效率较低且 ...

  3. 必须添加对程序集"System.Core"的引用

    在项目下的web.config中添加 <compilation debug="true" targetFramework="4.0"> <as ...

  4. Jquery回到顶部效果

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  5. poj2115 C Looooops(exgcd)

    poj2115 C Looooops 题意: 对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束. 若在有限次内结束,则输出循环次数. 否则输出死循环. ...

  6. 面试神体验之:get和post的区别

    由于本文是用markdown在本地编辑的,粘贴到本地的时候出现了一些页面bug,所以只好贴进代码里面,一些链接失效,望见谅 Get和POST的区别 都9102年了,你们还在问get和post的区别?是 ...

  7. newcoder Tachibana Kanade Loves Probability(小数点后第k位)题解

    题意:题目链接立华奏在学习初中数学的时候遇到了这样一道大水题: “设箱子内有 n 个球,其中给 m 个球打上标记,设一次摸球摸到每一个球的概率均等,求一次摸球摸到打标记的球的概率” “emmm...语 ...

  8. Learning-MySQL【5】:数据的操作管理

    一.插入数据 1.为表的所有字段插入数据 通常情况下,插入的新纪录要包含表的所有字段 INSERT 语句有两种方式可以同时为表的所有字段插入数据,第一种方式是不指定具体的字段名,第二种方式是列出表的所 ...

  9. 05. .stop、.prevent、.capture、.self、.once、

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. MyEclipse运行Java出错:could not find the main class:test.program will exit(导入项目)

    自己新建的项目运行没有任何问题.但是我导入的很早以前别人写的项目,然后run就会弹框could not find the main class:test.program will exit 请确认JA ...