装饰器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
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zd_nupt/article/details/80320481
个人分类: python
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

装饰器Decorator

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭