函数篇--装饰器

1.装饰器的作用

在 不修改被装饰对象的源代码;不修改被装饰对象的调用方式; 为被封装的对象添加新的功能。

例如下列:

test函数为事先封装好的一个功能,但是在后期迭代的过程中,希望能为该功能增加一个计算运行时间的功能。这时候,装饰器就起到了作用了。

def test(s):
    print('%s is testing'%s)
    time.sleep(3)
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print(start - end)
        return res
    return wrapper

test= timer(test)
###新的函数test中含有打印运行时间的功能,单完全没有改变之前函数的源代码,以及调用方式
test('dd')

  下面是装饰器的真正使用方法 : @wrapper

import time 

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print(start - end)
        return res
    return wrapper

@timer  ##引用装饰器
def test(s):
    print('%s is testing'%s)
    time.sleep(3)

test('tina')

  无参装饰器

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print(start - end)
        return res
    return wrapper

@timer
def test(s):
    print('%s is testing'%s)
    time.sleep(3)

test('tina')

  有参装饰器

def data_from(file):
    def data_form(func):
        def wrapper(*args, **kwargs):
            if file == 'txt':
                print('data from txt')
                res = func(*args, **kwargs)
                return  res
            if file == 'sql':
                print('data from sql')
            if file == 'mongodb':
                print('data from mongodb')
        return wrapper
    return data_form

@data_from('sql')
def tell_name(name):
    print('my name is %s' %name)

tell_name('tt')

  

  

猜你喜欢

转载自www.cnblogs.com/tina053/p/10331260.html
今日推荐