转载地址:http://python.jobbole.com/82344/
1.>>原理:
[root@VM_131_54_centos opentsdb_script]# cat d.py
import time
def deco(func):
start_time = time.time()
func()
end_time = time.time()
run_time = (end_time-start_time)
print run_time
def myfunc():
time.sleep(0.6)
deco(myfunc)
[root@VM_131_54_centos opentsdb_script]# python d.py
0.600670099258
##################################################
+++++++++++++++++++++装饰器+++++++++++++++++
[root@VM_131_54_centos opentsdb_script]# python dd.py
0.600654125214
[root@VM_131_54_centos opentsdb_script]# cat dd.py
import time
def deco(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
run_time = (end_time-start_time)
print run_time
return wrapper
def myfunc():
time.sleep(0.6)
myfunc = deco(myfunc)
myfunc()
函数名类似c中的指针。
2.>>语法糖
[root@VM_131_54_centos opentsdb_script]# python dd.py
0.600659132004
[root@VM_131_54_centos opentsdb_script]# cat dd.py
import time
def deco(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
run_time = (end_time-start_time)
print run_time
return wrapper
@deco
def myfunc():
time.sleep(0.6)
myfunc()
使用了@装饰器名后,简洁了。
3.>>带参数
[root@VM_131_54_centos opentsdb_script]# cat dd.py
import time
def 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
@deco
def myfunc(a,b):
print a,b
time.sleep(0.6)
myfunc(1,3)
[root@VM_131_54_centos opentsdb_script]# python dd.py
1 3
0.600697994232
4.>>双层装饰器。
调用顺序:
装饰器是可以叠加使用的,那么这是就涉及到装饰器调用顺序了。对于Python中的”@”语法糖,装饰器的调用顺序与使用 @ 语法糖声明的顺序相反。
可以根据结果看出:
先把myfunc用deco2进行装饰,装饰器返回的wrapper函数再被deco1装饰。所以不是myfunc(a,b)被执行两遍,而是只有一遍。
[root@VM_131_54_centos opentsdb_script]# python dd.py
enter into deco1
enter into deco2
1 3
0.600661993027
0.60070681572
[root@VM_131_54_centos opentsdb_script]# cat dd.py
import time
def 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 wrapper
def 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
@deco2
def 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 是属性的意思,表示可以通过通过类实例直接访问的信息