(一) 装饰器基础知识

什么是Python装饰器?Python里装饰器是一个可调用的对象(函数),其参数是另一个函数(被装饰的函数)

假如有一个名字为somedecorator的装饰器,target是被装饰的函数:

>>> @somedecorator
... def target():
... print("running target")

上面代码的效果和下面的书写一样:

>>> target = somedecorator(target)

@somedecorator只是语法糖,工作原来就是上面这句代码,为了确认这个原理,我们看看下面控制台信息:

>>> def somedecorator(func):
... def inner():
... print("running inner")
... return inner
...
>>> @somedecorator
... def target():
... print("running target")
...
>>> target()
running inner
>>> target
<function somedecorator.<locals>.inner at 0x7f20829fb950>
>>>

从控制台信息我们可以看到target()语句只输出了somedecorator 里inner()的print,target函数已经被替换为somedocorator的返回值inner函数的引用。

从以上示例我们看到了装饰器第一个特性:能把被装饰的函数替换成其他函数。


下面我们看装饰器的第二个特性:import时执行:

(二)Python何时执行装饰器

我们通过一个示例来看效果:

有如下的py源文件Example7_2.py:

registry = []

def register(func):
print("running register(%s)" % func)
registry.append(func)
return func @register
def f1():
print("running f1") @register
def f2():
print("running f2") def f3():
print("running f3") def main():
print("running main")
print("registry ->", registry)
f1()
f2()
f3() if __name__ == "__main__":
main()
register是装饰器,f1和f2被register装饰,f3没有
我们尝试import Example7_2,看看控制台的输出:
>>> import Example7_2
running register(<function f1 at 0x7f9b534926a8>)
running register(<function f2 at 0x7f9b53492730>)

从控制台信息我们看到import Example7_2时,@register 就立即执行

我们再运行程序:

# python3 Example7_2.py
running register(<function f1 at 0x7fab49f750d0>)
running register(<function f2 at 0x7fab49f75158>)
running main
registry -> [<function f1 at 0x7fab49f750d0>, <function f2 at 0x7fab49f75158>]
running f1
running f2
running f3

这里看到被装饰的函数f1,f2在运行时才执行

这就是导入时和运行时的区别,

好了,今天先到这里,再会。

												

Python 装饰器Decorator(一)的更多相关文章

  1. python 装饰器(decorator)

    装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...

  2. Python装饰器--decorator

    装饰器 装饰器实质是一个函数,其作用就是在不改动其它函数代码的情况下,增加一些功能.如果我们需要打印函数调用前后日志,可以这么做 def log(func): print('%s is running ...

  3. Python装饰器(Decorator)简介

    Python有许多出色的语言特性,装饰器(Decorator)便是其中一朵奇葩.先来看看一段代码: def deco1(f): print 'decorate 1' return f def deco ...

  4. Python 装饰器Decorator(二)

    对于上一篇“”Python闭包“”随笔中提到的make_averager()函数的如下实现,我们把历史值保存在列表里,每次计算平均值都需要重新求和,当历史值较多时,需要占用比较多的空间并且效率也不高. ...

  5. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  6. python语法32[装饰器decorator](转)

    一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...

  7. python 语法之 装饰器decorator

    装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...

  8. python函数编程-装饰器decorator

    函数是个对象,并且可以赋值给一个变量,通过变量也能调用该函数: >>> def now(): ... print('2017-12-28') ... >>> l = ...

  9. Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...

随机推荐

  1. HBase 文件读写过程描述

    HBase 数据读写过程描述 我们熟悉的在 Hadoop 使用的文件格式有许多种,例如: Avro:用于 HDFS 数据序序列化与 Parquet:常见于 Hive 数据文件保存在 HDFS中 HFi ...

  2. jqu

    1 /*2 * 说明:3 * 本源代码的中文注释乃Auscarlin呕心沥血所作.旨在促进jQuery的传播以及向广大jQuery爱好者提供一个进阶4 *的途径,以让各位更加深入地了解jQuery,学 ...

  3. 使用Hexo + GitHub Pages 搭建个人博客

    一.前言 之前是在CSDN上写博客的,但是无奈其广告满天飞,还有因为个人不太喜欢CSDN博客里的一些东西,加上看到很多技术大牛都有自己的个人博客,于是乎!便想着搭建一个自己的个人博客.其实之前写博客还 ...

  4. Ubuntu16.04上安装neo4j数据库

    什么是neo4j数据库? neo4j数据库是图数据库的一种,属于nosql的一种,常见的nosql数据库还有redis.memcached.mongDB等,不同于传统的关系型数据库,nosql数据也有 ...

  5. PHP 好用第三方库

    PHP 好用第三方库 whoops 更好的php错误报告库 [github]:https://github.com/filp/whoops Whoops是一个易于处理和调试错误的PHP库 .它提供基于 ...

  6. Security 安全框架1

    security 过滤器链 检查请求是否有请求信息-主要校验规则 UsernamePasswordAuthenticationFilter: 处理表单登录, 请求是否带用户名密码 BasicAuthe ...

  7. 【 C 】字符串常量

    当一个字符串常量出现在表达式中时,它的值是个指针常量.编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针.但是,当数组名用于表达式中时,它们的值也是个指针常量.我们可以 ...

  8. 20155329胡佩伦 《Java程序设计》第3周学习总结

    学号 2016-2017-20155329胡佩伦 <Java程序设计>第3周学习总结 教材学习内容总结 本周复习巩固了运算符. 前缀自增自减法(++i,--i): 先进行自增或者自减运算, ...

  9. # 2017-2018-1 20155336《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155336<信息安全技术>实验二——Windows口令破解 实验原理 口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理 ...

  10. apt-get 0%

    错误如下:      www.2cto.com   使用apt-get命令安装软件时出现“0%[正在等待报头]“的提示且无法继续安装,一般出现此问题是因为安装过程中Ctrl+C强行中断或其它原因导致上 ...