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)