import time
def foo():
print("foo....")
time.sleep(1)
def bar():
print("bar>>>")
time.sleep(2)
def timea(x):
starttime = time.time()
x()
overtime = time.time()
print("spend %s"%(overtime -starttime))
timea(foo)
timea(bar)
老板说,增加个time统计功能,好了,timea模块写完了~~~~~~~~~~~~
老板又说,其他员工投诉了,你改了调用方式,其他的程序都要重新写啊...
经过第二课时的学习,知道了,内存地址,用return 返回内存地址,然后赋值给原来的参数,那么,问题解决了!
import time def foo(): print("foo....") time.sleep(1) def bar(): print("bar>>>") time.sleep(2) def timea(x): def inner(): starttime = time.time() x() overtime = time.time() print("spend %s" % (overtime - starttime)) return inner foo = timea(foo) bar = timea(bar) foo() bar()
import time def timea(x): def inner(): starttime = time.time() x() overtime = time.time() print("spend %s" % (overtime - starttime)) return inner @timea def foo(): print("foo....") time.sleep(1) @timea def bar(): print("bar>>>") time.sleep(2) foo() bar()
后来老师又讲了很高大上的@方法,将“@”放到def的上表面就可以了, @timea 代表了 fo0= timea(foo)
面对需要传递参数的装饰器该怎么办???
import time def timea(x): def inner(k,y): starttime = time.time() x(k,y) overtime = time.time() print("spend %s" % (overtime - starttime)) return inner @timea def add(a,b): print(a+b) time.sleep(2) add(3,5)
这个都是定常参数,如果换成不定常参数呢???
import time def timea(x): def inner(*sss): starttime = time.time() x(*sss) overtime = time.time() print("spend %s" % (overtime - starttime)) return inner @timea def add(*sss): print(sum(sss)) time.sleep(2) add(3,5,10)
以下比较难以理解~~~~~装饰器也能再嵌套给函数~~代码如下
import time def logd(flag=""): def timea(x): def inner(*sss): starttime = time.time() x(*sss) overtime = time.time() print("spend %s" % (overtime - starttime)) if flag == "true": print("日志记录") return inner return timea @logd("true") def add(*sss): print(sum(sss)) time.sleep(2) @logd() def bdd(*sss): print(sum(sss)) time.sleep(2) add(3, 5, 10) print("——"*25) bdd(3, 5, 10)

