装饰器Decorator

1.定义:
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
装饰器本质上就是闭包的使用,闭包就是函数的引用,闭包就是把要装饰的函数引用过来但是不运行,完成必要的功能在运行要装饰的函数,这样就完成了函数的动态功能扩展。
Python装饰器是Python中的特有变动,可以使修改函数变得更容易。
2:实现

#coding:utf-8
import time
def log(func):
    def dec():
        time_start=time.time()
        func()
        time_end=time.time()
        print("用时:"+str(time_end-time_start))
        return func #返回函数本身,装饰器并不修改原函数
    return dec
@log
def sum_100():
    print(sum(range(101)))
sum_100()

输出为:
5050
用时:0.0
相当于是
def sum_100():
    print(sum(range(101)))
sum_100=log(sum_100)
sum_100()

如果函数有参数,则上述程序将报错:
改进:
#coding:utf-8
import time
def log(func):
    def dec(*args,**kw):
        time_start=time.time()
        func(*args,**kw)
        time_end=time.time()
        print("用时:"+str(time_end-time_start))
        return func
    return dec
@log
def sum_100(n):
    print(sum(range(n+1)))
sum_100(100)
输出为:
5050
用时:0.0

如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本:
#coding:utf-8
import time
def log(text):
    def decorator(func):
        def dec(*args,**kwargs):
            print(text)
            time_start=time.time()
            func(*args,**kwargs)
            time_end=time.time()
            print("用时:"+str(time_end-time_start))
            return func
        return dec
    return decorator
@log("welocme")
def sum_100(n):
    print(sum(range(n+1)))
sum_100(100)

结构上:
def log(text):
    def decorator(func):
        def dec(*args,**kwargs):
            return func
        return dec
    return decorator
对称结构,其中最内层return 被装饰的函数。

输出:
welocme
5050
用时:0.0

猜你喜欢

转载自blog.csdn.net/zd_nupt/article/details/80320481