Python基础教程:装饰器的详细教程

一、什么是装饰器

目的:给func()方法,增加一个功能,在fun()执行期间,同时把fun()执行速率机算出来

import time
def func():
    print('嘻嘻哈哈')


start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))

如果,我们给fun1,fun2,fun3,实现相同的功能呢?

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():
    print('嘻嘻哈哈')

def timmer(f):
    start_time = time.time()
    time.sleep(0.1)
    f()
    end_time = time.time()
    print('----> 执行效率%s'%(end_time - start_time))

f = func
func = timmer
func(f)

但是,每次都需要将函数作为函数,传递给timmer(),而且这种方式已经破坏了原有的逻辑结构,之前的逻辑结构,是执行fun的同时,计算执行效率,但是现在是把fun传给第三方函数,进行计算。

怎么解决这种问题呢,装饰器。

装饰器就是:在不改动原函数代码前提下,增加额外的功能,装饰的返回值也是一个函数对象。

def func():
     print('嘻嘻哈哈')


def timmer(f):
    start_time = time.time()
    time.sleep(0.1)
    f()
    end_time = time.time()
    print('----> 执行效率%s'%(end_time - start_time))
    return timmer

f = timmer(func)
f()

@语法糖 : 在定义函数的时候使用,避免再一次赋值操作。

代码修改如下:

def timmer(f):
    start_time = time.time()
    time.sleep(0.1)
    f()
    end_time = time.time()
    print('----> 执行效率%s'%(end_time - start_time))
    return timmer

@timmer
def func():
     print('嘻嘻哈哈')     

二、带参数的装饰器

import time


def wrapper(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        f(*args,**kwargs)
        end_time = time.time()
        print('----> 执行效率%s' % (end_time - start_time))
    return inner

@wrapper
def fun(a):
    print("%s嘻嘻哈哈" %(a))

@wrapper
def fun1(a,b):
    print('%s嘻嘻哈哈,%s也跟着嘻嘻哈哈' %(a,b))

三、带返回值的装饰器

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def wrapper(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        ret = f(*args,**kwargs)
        end_time = time.time()
        print('----> 执行效率%s' % (end_time - start_time))
        return ret
    return inner

@wrapper
def fun(a):
    s = "%s嘻嘻哈哈" %(a)
    return s

print(name)

总结:就是 我们调用 fun() 方法,实现原来的功能,并且增加新的功能,前提不能修改源代码。

猜你喜欢

转载自blog.csdn.net/sinat_38682860/article/details/119968959