Python 装饰器Decorator(一)
(一) 装饰器基础知识
什么是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(一)的更多相关文章
- python 装饰器(decorator)
装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...
- Python装饰器--decorator
装饰器 装饰器实质是一个函数,其作用就是在不改动其它函数代码的情况下,增加一些功能.如果我们需要打印函数调用前后日志,可以这么做 def log(func): print('%s is running ...
- Python装饰器(Decorator)简介
Python有许多出色的语言特性,装饰器(Decorator)便是其中一朵奇葩.先来看看一段代码: def deco1(f): print 'decorate 1' return f def deco ...
- Python 装饰器Decorator(二)
对于上一篇“”Python闭包“”随笔中提到的make_averager()函数的如下实现,我们把历史值保存在列表里,每次计算平均值都需要重新求和,当历史值较多时,需要占用比较多的空间并且效率也不高. ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- python语法32[装饰器decorator](转)
一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...
- python 语法之 装饰器decorator
装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...
- python函数编程-装饰器decorator
函数是个对象,并且可以赋值给一个变量,通过变量也能调用该函数: >>> def now(): ... print('2017-12-28') ... >>> l = ...
- Python——装饰器(Decorator)
1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...
随机推荐
- Java中的clone方法-理解浅拷贝和深拷贝
最近学到Java虚拟机的相关知识,更加能理解clone方法的机制了 java中的我们常常需要复制的类型有三种: 1:8种基本类型,如int,long,float等: 2:复合数据类型(数组): 3:对 ...
- 1001. 温度转换 (Standard IO)
1001. 温度转换 (Standard IO) 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 题目描述 将输入的华氏温度转换为摄氏温度.由华氏温度F与摄氏温度C的转换 ...
- BZOJ 4520: [Cqoi2016]K远点对(k-d tree)
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1162 Solved: 618[Submit][Status][Discuss] Descripti ...
- activemq的高级特性:消息的可靠性
高级特性之消息的可靠性 可靠性分为:生产者.消费者.生产者必须让mq收到消息,消费者必须能够接收到消息并且消费成功,这就是消息的可靠性. 1:生产者可靠性 Session session = conn ...
- Vue 父组件调用子组件的方法
qwq 前两天看了下vue,父子组件方法的调用,怕忘记,所以做个小记录. 一.父组件调用子组件的方法 1.父组件 <template> <div id="rightmen ...
- jQuery增减类操作代码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Find the Duplicate Number (寻找重复数字)
对于一个长度为n+1的数组,其中每一个值的取值范围是[1,n],可以证明的是必然存在一个重复数字(抽屉原理),假设仅存在一个重复数字,找到他. 举例:输入:[1,3,4,2,1],输出:1 自己做的时 ...
- js点击后将文字复制到剪贴板,将图片复制到画图
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML> <HEAD& ...
- 2017-2018-1 《信息安全技术》实验二——Windows口令破解
2017-2018-1 <信息安全技术>实验二--Windows口令破解 所用工具 系统:能勾起我回忆的Windows 2003 工具:LC5.SuperDic Windows口令破解 口 ...
- 20155305 2016-2017-2 《Java程序设计》实验四 Android程序开发基础
实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组件.布局管理器的使用: 掌握Android中事件处理机制 实验 ...