没有所谓的捷径
一切都是时间最平凡的累积

python装饰器初识

本文最后更新于2019年8月21日,已超过33天没有更新,如果文章内容失效,请反馈给我们,谢谢!

简单的说,装饰器是修改其他函数的功能的函数

例子1: 简单装饰器,用于记录函数执行时间

def record_time_a(func):
    # 记录函数执行时间装饰器
    @wraps(func)  # 如果不加@wraps(func),select_sort.__name__等于wrapper
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print("函数 %s 运行时间为: %s" % (func.__name__, time.time() - start))
        return result
    return wrapper

例子2:带参数的装饰器,不让装饰器函数和print函数耦合

def record_time_b(output):
    """自定义带参数的装饰器
    记录函数执行时间装饰器
    """
    def decorate(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            start = time.time()
            result = func(*args, **kwargs)
            output(func.__name__, time.time() - start)
            return result
        return wrapper
    return decorate

例子3:类装饰器,通过__call__魔术方法是的对象可以当成函数调用

class record_time_c():
    """
    自定义装饰器类
    通过__call__魔术方法使得对象可以当成函数调用
    """

    def __init__(self, output):
        self.output = output

    def __call__(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            start = time.time()
            result = func(*args, **kwargs)
            self.output(func.__name__, time.time() - start)
            return result
        return wrapper

下面写一个函数,并使用三种装饰器

@record_time_c(print)
@record_time_b(print)
@record_time_a
def select_sort(origin_items, comp=lambda x, y: x < y):
    """简单选择排序"""
    items = origin_items[:]
    for i in range(len(items) - 1):
        min_index = i
        for j in range(i + 1, len(items)):
            if comp(items[j], items[min_index]):
                min_index = j
        items[i], items[min_index] = items[min_index], items[i]
    time.sleep(3)
    return items

print(select_sort([1, 6, 4, 3]))

执行结果:

函数 select_sort 运行时间为: 3.000171661376953
select_sort 3.000171661376953
select_sort 3.000171661376953
[1, 3, 4, 6]

 

赞(0) 打赏
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除,联系邮箱:lwarm@qq.com。文章观点不代表本站立场。本站原创内容未经允许不得转载,或转载时需注明出处:红岩子 » python装饰器初识
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

今天所做的努力都是在为明天积蓄力量

联系我们赞助我们