day12:装饰器进阶

def ppd():
    """一个打印ppd的函数的函数"""
print(ppd.__name__)    #查看字符串格式的函数名
print(ppd.__doc__)     #document

from functools import wraps


def wrapper(func):
    @wraps(func)
    def inner(*args, **kwargs):
        print("在被装饰函数之前要做的事")
        ret = func(*args, **kwargs)
        print("在被装饰函数之后要做的事")
        return ret
    return inner


@wrapper
def ppd():
    print("once test")
    return "second test"


ret = ppd()
print(ret)
装饰器的固定模式(wraps)

import time
flag = True  # 控制装饰器是否工作


def timer_out(flag):
    def timer(func):
        def inner(*args, **kwargs):
            if flag:
                start = time.time()
                ret = func(*args, **kwargs)
                end = time.time()
                print(end - start)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret
        return inner
    return timer


@timer_out(flag)  # timer = timer_out(flag) --> #test_one = timer(test_one)
def test_one():
    time.sleep(0.1)
    print("我是第一个函数")


@timer_out(flag)  # timer = timer_out(flag) --> #test_two = timer(test_two)
def test_two():
    time.sleep(0.1)
    print("我是第二个函数")


test_one()
test_two()
带参数的装饰器(例子)

flag = True  # 控制装饰器是否工作


def wrapper_out(flag):
    def wrapper(func):
        def inner(*args, **kwargs):
            ret = func(*args, **kwargs)
            return ret
        return inner
    return wrapper


@wrapper_out(flag)  # wrapper = wrapp_out(flag) --> #test_one = wrapper(test_one)
def test_one():
    print("我是第一个函数")


@wrapper_out(flag)  # wrapper = wrapp_out(flag) --> #test_two = wrapper(test_two)
def test_two():
    print("我是第二个函数")


test_one()
test_two()
带参数的装饰器(模板)

def wrapper1(func):
    def inner1():
        print("在wrapper1中,在被装饰函数之前要做的事")
        ret = func()
        print("在wrapper1中,在被装饰函数之后要做的事")
        return ret
    return inner1


def wrapper2(func):
    def inner2():
        print("在wrapper2中,在被装饰函数之前要做的事")
        ret = func()
        print("在wrapper2中,在被装饰函数之后要做的事")
        return ret
    return inner2


@wrapper1
@wrapper2
def ppd():
    print("sss")
    return "xxx"


ret = ppd()
print(ret)
多个装饰器修饰一个函数

猜你喜欢

转载自www.cnblogs.com/believepd/p/9570813.html