当前位置:首页 > Python教程 > python技巧

Python编程之基础知识练习_002

练习内容:

  (1)函 数装饰器。
 (2)使用魔术方法__call__,将一个类实现为装饰器
 (3)使用魔术方法__enter__与__exit__,实现一个类,使其能为函数提供上下文管理功能。

1.函数装饰器

             1
            __author__ = Orcsir 2from functools import wraps, update_wrapper
 3import time
 4 5 6# 将一个函数实现为装饰器 7def timeit(func):
 8    @wraps(func)
 9def _wrapper(*args, **kwargs):
10print("Inject some code before func run.")
1112         ret = func(*args, **kwargs)
1314print("Inject some code after func run.")
1516return ret
1718return _wrapper
192021@timeit
22def func(*args, **kwargs):
23print("func start processing.")
24     time.sleep(2)  # 模拟处理时间25print("func end processing.")
26return None
2728# Test29 func(1,2)

 2.使用魔术方法__call__,将一个类实现为装饰器

             1
            __author__ = Orcsir 2from functools import wraps, update_wrapper
 3import time
 4 5# 将一个类实现为装饰器 6class TimeIt:
 7def__init__(self, wrapped):
 8         self.__wrapped = wrapped
 9        wraps(wrapped)(self)
1011def__call__(self, *args, **kwargs):
12print("Inject some code before func run.")
13         ret = self.__wrapped(*args, **kwargs)
14print("Inject some code after func run.")
15return ret
161718@TimeIt
19def func(*args, **kwargs):
20print("func start processing.")
21     time.sleep(2)  # 模拟处理时间22print("func end processing.")
23return None
2425# Test26 func()

3.使用魔术方法__enter__与__exit__,实现一个类,使其能为函数提供上下文管理功能

             1
            __author__ = Orcsir 2from functools import wraps, update_wrapper
 3import time
 4 5# 实现一个类,使其为函数提供上下文管理功能 6class ContextMage4Func:
 7def__init__(self, func):
 8         self.__func = func
 910def__enter__(self):
11print("为func函数的运行准备环境.")
12return self.__func1314def__exit__(self, exc_type, exc_val, exc_tb):
15print("func函数退出或出现异常时,做一些清理工作.")
161718def func(*args, **kwargs):
19print("func start processing.")
20     time.sleep(2)  # 模拟处理时间21print("func end processing.")
22return None
2324# Test25with ContextMage4Func(func):
26     func(1, 2)
27print("~~~~~~~~~~~~~~~~~~~~~~")
28with ContextMage4Func(func) as f:
29     f(1, 2)

 

原文:https://www.cnblogs.com/orcsir/p/9029328.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!