python装饰器

该博客探讨了Python中的函数增强技术,包括普通实现、闭包实现和装饰器实现。通过`count_time`函数展示了如何计算函数执行时间。同时,演示了多层装饰器和装饰器传递参数的应用,如`log_wrapper`和`count_time_wrapper`。最后,使用这些装饰器增强了`print_quality`函数,实现了日志记录和时间计算的功能。
摘要由CSDN通过智能技术生成

装饰器,闭包,函数增强

#!/usr/bin/env python
# coding=utf-8
import time
import logging

logger = logging.getLogger(__name__)


# 普通实现函数增强
def count_time(func):
    start_time = time.time()       # 起始时间
    func()  # 执行函数   # 结束时间
    # time.sleep(2)
    end_time = time.time()
    print(f"it takes {end_time - start_time} s to find all ths olds")


# 闭包实现函数增强
def count_time_wrapper(func):
    # 增强func函数,当增强的函数有参数时,需要设置*args, **kwargs
    def improved_func(*args, **kwargs):
        start_time = time.time()  # 起始时间
        # 当需要增强的函数有返回值时需要接收,当增强的函数有参数时*args, **kwargs
        ret = func(*args, **kwargs)  # 执行函数   # 结束时间
        # time.sleep(2)
        end_time = time.time()
        print()
        print(f"it takes {end_time - start_time} s to find all ths olds")
        return ret
    # 返回增强后的函数
    return improved_func


# 装饰器实现增强【主函数】
@count_time_wrapper
def print_quality():

    for i in range(2, 1000):
        if i == 2:
            print(i, end="\t")
        for j in range(2, i):
            if i % j == 0:
                break
            elif i / j < j:
                print(i, end="\t")
                break


def coumt_odd(lim=100):
    a = 0
    print(lim)
    for i in range(lim):
        if i % 2 == 1:
            a += i
    return a


# 主函数
def print_odd():
    for i in range(1000):
        if i % 2 == 1:
            print(i)


if __name__ == '__main__':
    # count_time(print_odd)     # 普通实现
    # imp = count_time_wrapper(print_odd)   # 闭包实现
    # imp()
    # print_quality()     # 添加装饰器实现
    imp = count_time_wrapper(coumt_odd) # 主函数有返回值和参数时
    print(imp(lim=200))

多层装饰器,装饰器参数

#!/usr/bin/env python
# coding=utf-8
import time


# 传参多加一层
def log_wrapper(info):
    def internal_log_wrapper(func):
        def improved_func1():
            start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))    # 起始时间
            # time.sleep(2)
            func()
            end_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))  # 结束时间
            print()
            print(f"Logging: func:{func.__name__} runs from {start_time} to {end_time}, info[{info}]")
        # 返回增强后的函数
        return improved_func1
    return internal_log_wrapper


def count_time_wrapper(func):

    def improved_func2():
        start_time = time.time()  # 起始时间
        # time.sleep(2)
        func()
        end_time = time.time()
        print()
        print(f"it takes {end_time - start_time} s to find all ths olds")
    # 返回增强后的函数
    return improved_func2


# @count_time_wrapper
@log_wrapper(info='hello haha')     # 装饰器传参
def print_quality():

    for i in range(2, 1000):
        if i == 2:
            print(i, end="\t")
        for j in range(2, i):
            if i % j == 0:
                break
            elif i / j < j:
                # print(i, end="\t")
                break
    # print("qual")


if __name__ == '__main__':
    # 双层装饰器等价于
    # orig = log_wrapper(count_time_wrapper(print_quality))
    # print(print_quality.__name__)
    # orig1 = count_time_wrapper(print_quality)   # 定义count_time_wrapper
    # print(orig1.__name__)
    # orig1 = log_wrapper(orig1)  # 定义log_wrapper
    # print(orig1.__name__)
    # orig1()     # 调用函数首先调用count_time_wrapper内的加强函数,再调用log_wrapper内的函数
    print_quality()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值