Python装饰器
来源:互联网 发布:网页版流程图软件 编辑:程序博客网 时间:2024/06/08 08:33
转载地址:http://python.jobbole.com/82344/
1.>>原理:
[root@VM_131_54_centos opentsdb_script]# cat d.pyimport timedef deco(func): start_time = time.time() func() end_time = time.time() run_time = (end_time-start_time) print run_timedef myfunc(): time.sleep(0.6)deco(myfunc)[root@VM_131_54_centos opentsdb_script]# python d.py0.600670099258##################################################+++++++++++++++++++++装饰器+++++++++++++++++[root@VM_131_54_centos opentsdb_script]# python dd.py0.600654125214[root@VM_131_54_centos opentsdb_script]# cat dd.pyimport timedef deco(func): def wrapper(): start_time = time.time() func() end_time = time.time() run_time = (end_time-start_time) print run_time return wrapperdef myfunc(): time.sleep(0.6)myfunc = deco(myfunc)myfunc()
函数名类似c中的指针。
2.>>语法糖
[root@VM_131_54_centos opentsdb_script]# python dd.py0.600659132004[root@VM_131_54_centos opentsdb_script]# cat dd.py import timedef deco(func): def wrapper(): start_time = time.time() func() end_time = time.time() run_time = (end_time-start_time) print run_time return wrapper@decodef myfunc(): time.sleep(0.6)myfunc()
使用了@装饰器名后,简洁了。
3.>>带参数
[root@VM_131_54_centos opentsdb_script]# cat dd.py import timedef deco(func): def wrapper(a,b): start_time = time.time() func(a,b) end_time = time.time() run_time = (end_time-start_time) print run_time return wrapper@decodef myfunc(a,b): print a,b time.sleep(0.6)myfunc(1,3)[root@VM_131_54_centos opentsdb_script]# python dd.py 1 30.600697994232
4.>>双层装饰器。
调用顺序:
装饰器是可以叠加使用的,那么这是就涉及到装饰器调用顺序了。对于Python中的”@”语法糖,装饰器的调用顺序与使用 @ 语法糖声明的顺序相反。
可以根据结果看出:
先把myfunc用deco2进行装饰,装饰器返回的wrapper函数再被deco1装饰。所以不是myfunc(a,b)被执行两遍,而是只有一遍。
[root@VM_131_54_centos opentsdb_script]# python dd.py enter into deco1enter into deco21 30.6006619930270.60070681572[root@VM_131_54_centos opentsdb_script]# cat dd.py import timedef deco1(func): def wrapper(a,b): print "enter into deco1" start_time = time.time() func(a,b) end_time = time.time() run_time = (end_time-start_time) print run_time return wrapperdef deco2(func): def wrapper(a,b): print "enter into deco2" start_time = time.time() func(a,b) end_time = time.time() run_time = (end_time-start_time) print run_time return wrapper@deco1@deco2def myfunc(a,b): print a,b time.sleep(0.6)myfunc(1,3)
5.>>类装饰器:
待补全
6.>>内置装饰器:
在Python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod 和property。staticmethod 是类静态方法,其跟成员方法的区别是没有 self 参数,并且可以在类不进行实例化的情况下调用classmethod 与成员方法的区别在于所接收的第一个参数不是 self (类实例的指针),而是cls(当前类的具体类型)property 是属性的意思,表示可以通过通过类实例直接访问的信息
阅读全文
0 0
- python装饰器装饰类
- [python]python装饰器
- Python装饰器学习
- Python装饰器
- python 装饰器
- Python装饰器
- python 装饰器 应用
- python 装饰器2
- Python装饰器学习
- python装饰器
- python装饰器
- python 装饰器入门
- python装饰器
- python装饰器
- python 装饰器'@'
- python装饰器
- Python装饰器详解
- python 装饰器
- 安卓轮播图控件ConvenientBanner的使用
- SharedPreference用法
- 设计模式也可以这么简单
- 对象的生存周期探究
- HTML中温度符号的输入
- Python装饰器
- angular过滤器
- shell笔记sed
- java类加载
- 【信息融合】信息融合的概念和理论
- python动态获取对象的属性和方法
- 集群管理——(7)远程连接软件配置
- tensorflow错误记录:tf.concat
- 专家担心iOS开发者获取iPhone X面部数据