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 @   星瑞  阅读(128)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
历史上的今天:
2018-01-29 Java之使用HttpClient发送GET请求
点击右上角即可分享
微信分享提示