Discuss / Python / 交个作业

交个作业

Topic source

装饰器看了半天也是一头雾水,现在的理解就是,让每个需要真正运行的函数在跑的时候带上另外一个函数,而这个附带的函数本身不影响真正运行的函数本身,只是在需要运行的函数结果上加一些花花草草,起到一些装饰的效果。

如果你要执行函数D,函数N,函数B的时候显示他们正在被调用,其实就是在他们的每一个函数内都创建一个print就可以,但是如果是100个函数都要这样做,那就需要给他们加个什么玩意儿,来实现这个功能。

做法就是:创建一个函数A,在函数A内再创建一个函数B,函数B可接收任意参数(星号arg,双星号kw),然后在函数B内写入需要给正主儿(函数D,函数N,函数B等等)统计或者说明的一些内容,比如输入一个print("我是slef,我正在被调用....")来体现自身是否被调用,然后函数B需要return函数A的参数(也就是函数D,函数N,函数B等等的“函数对象”--没有括号的D,N,B,并加上函数B的可接收的参数内容,也就是任意参数)这样函数B就完成了,接下来函数A再return这个函数B的函数对象(没有括号),这样就算是完成了这个叫做装饰器的函数。

然后再通过python自带的功能,在执行D(),N(),B()这些函数之前,输入@A回车,这样函数D,N,B就被装饰成功了,之后再调用这些函数的时候,就会连带装饰器(函数A)一起执行。

下面是的交作业,可以执行成功,但是装饰器带参数就是再给函数A包上一层,这个还暂时不理解。

>>> def metric(func):
        def wrapper(*args, **kw):
            start = time.time()
            result = func(*args,**kw)
            end = time.time()
            print('%s running in %s ms' % (func.__name__, end-start))
            return result
        return wrapper

    >>> @metric
    def fast(x,y):
        time.sleep(1.2)
        return x*y

    >>> fast(3,4)
    fast running in 1.200068473815918 ms
    12

  • 1

Reply