1. 程式人生 > >Python編程之基礎知識練習_002

Python編程之基礎知識練習_002

tar time imp roc 魔術方法 class sta family 函數實現

練習內容:

(1)函數裝飾器。
(2)使用魔術方法__call__,將一個類實現為裝飾器
(3)使用魔術方法__enter__與__exit__,實現一個類,使其能為函數提供上下文管理功能。

1.函數裝飾器

 1 __author__ = Orcsir
 2 from functools import wraps, update_wrapper
 3 import time
 4 
 5 
 6 # 將一個函數實現為裝飾器
 7 def timeit(func):
 8     @wraps(func)
 9     def _wrapper(*args, **kwargs):
10         print
("Inject some code before func run.") 11 12 ret = func(*args, **kwargs) 13 14 print("Inject some code after func run.") 15 16 return ret 17 18 return _wrapper 19 20 21 @timeit 22 def func(*args, **kwargs): 23 print("func start processing.") 24 time.sleep(2) #
模擬處理時間 25 print("func end processing.") 26 return None 27 28 # Test 29 func(1,2)

2.使用魔術方法__call__,將一個類實現為裝飾器

 1 __author__ = Orcsir
 2 from functools import wraps, update_wrapper
 3 import time
 4 
 5 # 將一個類實現為裝飾器
 6 class TimeIt:
 7     def __init__(self, wrapped):
 8         self.__wrapped
= wrapped 9 wraps(wrapped)(self) 10 11 def __call__(self, *args, **kwargs): 12 print("Inject some code before func run.") 13 ret = self.__wrapped(*args, **kwargs) 14 print("Inject some code after func run.") 15 return ret 16 17 18 @TimeIt 19 def func(*args, **kwargs): 20 print("func start processing.") 21 time.sleep(2) # 模擬處理時間 22 print("func end processing.") 23 return None 24 25 # Test 26 func()

3.使用魔術方法__enter__與__exit__,實現一個類,使其能為函數提供上下文管理功能

 1 __author__ = Orcsir
 2 from functools import wraps, update_wrapper
 3 import time
 4 
 5 # 實現一個類,使其為函數提供上下文管理功能
 6 class ContextMage4Func:
 7     def __init__(self, func):
 8         self.__func = func
 9 
10     def __enter__(self):
11         print("為func函數的運行準備環境.")
12         return self.__func
13 
14     def __exit__(self, exc_type, exc_val, exc_tb):
15         print("func函數退出或出現異常時,做一些清理工作.")
16 
17 
18 def func(*args, **kwargs):
19     print("func start processing.")
20     time.sleep(2)  # 模擬處理時間
21     print("func end processing.")
22     return None
23 
24 # Test
25 with ContextMage4Func(func):
26     func(1, 2)
27 print("~~~~~~~~~~~~~~~~~~~~~~")
28 with ContextMage4Func(func) as f:
29     f(1, 2)

Python編程之基礎知識練習_002