Python之装饰器

# 装饰器功能说明
"""
    python中的装饰器(decorator)一般采用语法糖的形式,是一种语法格式。
        比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name等都是python中的装饰器。
    装饰器,装饰的对象是函数或者方法。各种装饰器的作用都是一样的:改变被装饰函数或者方法的功能,性质。
"""
import time


def how_much_time(func):
    print("how_much_time函数开始运行")

    def inner():
        t_start = time.time()
        func()
        t_end = time.time()
        print(f"一共花费了{t_end - t_start:.6f}秒时间")

    return inner


# @how_much_time等价于sleep_1s = how_much_time(sleep_1s)
@how_much_time
def sleep_1s():
    """
    how_much_time函数开始运行
    1秒结束了
    一共花费了1.007465秒时间
    """
    time.sleep(1)
    print("%d秒结束了" % (1,))


sleep_1s()  # 执行


def mylog(func):
    print("mylog函数开始运行")

    def inner_2():
        print("start")
        func()
        print("end")

    return inner_2


# 多个装饰器demo1,等价于mylog(how_much_time(sleep_more))
@mylog
@how_much_time
def sleep_more():
    """
    how_much_time函数开始运行
    mylog函数开始运行
    start
    2秒结束了
    一共花费了2.003144秒时间
    end
    """
    time.sleep(2)
    print("%d秒结束了" % (2,))


sleep_more()


def add(func):
    def inner():
        x = func()
        x = x + 1
        print("add方法执行,x:", x)
        return x

    return inner


def cube(func):
    def inner():
        x = func()
        x = x * x * x
        print("cube方法执行,x:", x)
        return x

    return inner


def square(func):
    def inner():
        x = func()
        x = x * x
        print("square方法执行,x:", x)
        return x

    return inner


# 多装饰器demo2,先square,再cube,最后add
@add
@cube
@square
def test():
    """
    square方法执行,x: 4
    cube方法执行,x: 64
    add方法执行,x: 65
    65
    """
    return 2


print(test())

# 带参数的装饰器
print("", sep="\n")
print("#" * 5, "带参数的装饰器", "#" * 5, sep=" ")


def logger(msg):
    def time_master(func):
        def inner():
            start = time.time()
            func()
            end = time.time()
            print(f"{msg}函数执行耗时{end - start:.4f}")

        return inner

    return time_master


@logger(msg="my_fun")
def my_fun():
    """
    my_fun正在执行
    my_fun函数执行耗时1.0109
    """
    print("my_fun正在执行")
    time.sleep(1)


my_fun()  # 等于没有装饰器时的调用 logger(msg="my_fun")(my_fun)()

 

posted @ 2023-01-29 00:42  星瑞  阅读(122)  评论(0编辑  收藏  举报