Python 自定义装饰器与上下文管理

1、定义装饰器实现计算函数运行时间

# 自定义装饰器
def compute_time(func):
    def compute(*args, **kwargs):
        st = time.time()
        result = func(*args, **kwargs)
        et = time.time()
        print('消费时间 %.6f s' % (et - st))
        return result

    return compute

# 使用
@compute_time
def work(work_iter=100000):
    for i in range(work_iter):
        pass

work()

自定义装饰器跟定义函数很相似,思路其实就是去模拟使用装饰器的函数,输入参数一致,期间执行其他操作;装饰器输入为函数,输出返回一个新的函数,即返回一个输入一致的新函数。

在这里在conputer_time装饰器函数里定义一个函数compute用来模仿work函数,但注意在这里输入和输出都应该保持一致,因为我只是计算他的运行时间而不想改变其结果,所以直接调用func获取结果并原封不动的返回。

使用*args, **kwargs来获取输入的所有参数,然后原封不动传给func。

2、自定义上下文管理实现计算运行时间;可以使用类或者函数的方式来定义。

class Timer:
    def __init__(self):
        pass
    
    # 上文
    def __enter__(self):
        self.st = time.time()
        return "我是谁"
    
    # 下文
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.et = time.time()
        self.execution_time = self.et - self.st
        print("共花费时间: %.6f"%(self.execution_time))

使用类的方式来定义上下文管理需要实现_enter__与__exit__两个方法,即分别对应上文与下文,对应刚初始化with语句时与执行with语句后,其中上文可以使用return返回可执行对象,对应with open('file_path') as f:中的f;在执行完with子句后执行下文程序;

import  time
with Timer() as t:
    print(t)
    time.sleep(2)

输出:

Python 自定义装饰器与上下文管理_第1张图片

 也可以使用函数的方式来定义上下文管理。

from contextlib import contextmanager
@contextmanager
def compute_time(x):
    # 在进入上下文之前执行的代码
    st = time.time()

    # 在进入上下文时可能会发生异常的代码
    yield "我是谁"
    print(x)
    et = time.time()
    print("共花费时间: %.6f"%(et - st))

其中yield以上程序对应上文程序,yield返回可执行对象(也可以直接yield 返回None对象),yield之后对应下文程序。

 

你可能感兴趣的:(python,开发语言)