Python装饰器

装饰器是Python中非常有用的功能,它们允许我们以简洁的方式添加功能已有的函数或方法上,而无需修改其内部代码。

装饰器允许通过将现有函数传递给装饰器,从而向现有函数添加一些额外的功能,该装饰器将执行现有函数的功能和添加的额外功能。装饰器本质上还是一个函数,它可以让已有的函数不做任何改动的情况下增加功能

例1:装饰器用于计算并打印被装饰函数的执行时间

import time
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')

def timeit(func):
    """
    装饰器函数,用于计算并记录被装饰函数的执行时间。

    参数:
    func (function): 需要被装饰的函数。

    返回:
    function: 返回包装后的函数。
    """
    def wrapper(*args, **kwargs):
        """
        包装函数,记录执行时间后调用原函数。

        参数:
        *args (tuple): 可变长度的参数列表。
        **kwargs (dict): 关键字参数字典。

        返回:
        any: 返回调用原函数的结果。
        """
        # 记录开始时间
        start_time = time.time()
        # 调用原函数并获取结果
        result = func(*args, **kwargs)
        # 记录结束时间
        end_time = time.time()
        # 计算执行时间
        elapsed_time = end_time - start_time
        # print(f'{func.__name__} took {elapsed_time:.4f} seconds to complete.')
        # 打印执行时间信息
        logging.info(f'{func.__name__} took {elapsed_time:.4f} seconds to complete.')
        # 返回原函数的结果
        return result

    return wrapper

@timeit
def some_function():
    """
    一个示例函数,模拟一些耗时的操作。
    """
    time.sleep(2)  # 模拟一个耗时操作,这里暂停2秒
    print('some_function has finished execution.')

# 调用装饰后的函数
some_function()




some_function has finished execution.
2024-12-03 22:52:46,430 some_function took 2.0001 seconds to complete.

例2:用于在执行被装饰的函数前记录警告日志


import logging

def use_log(func):
    """
    装饰器函数,用于在执行被装饰的函数前记录警告日志。

    参数:
    func (function): 需要被装饰的函数。

    返回:
    function: 返回包装后的函数。
    """
    def wrapper(*args, **kwargs):
        """
        包装函数,执行日志记录后调用原函数。

        参数:
        *args (tuple): 可变长度的参数列表。
        **kwargs (dict): 关键字参数字典。

        返回:
        any: 返回调用原函数的结果。
        """
        # 记录一条包含将要执行的函数名称的警告日志
        logging.warning('%s is running' % func.__name__)
        # 调用原函数并返回其结果
        return func(*args, **kwargs)

    return wrapper


@use_log
def bar():
    """
    测试函数,打印字符串。
    """
    print('I am bar')


@use_log
def haha():
    """
    另一个测试函数,打印字符串。
    """
    print('I am haha')


# 调用装饰后的函数
bar()
haha()
#
# ------------结果如下------------
# WARNING:root:bar is running
# I am bar
# WARNING:root:haha is running
# I am haha

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值