# _*_ coding: utf-8 _*_ """ python_context.py by xianhu """ import contextlib # èªå®ä¹æå¼æä»¶æä½ class MyOpen(object): def __init__(self, file_name): """åå§åæ¹æ³""" self.file_name = file_name self.file_handler = None return def __enter__(self): """enteræ¹æ³ï¼è¿åfile_handler""" print("enter:", self.file_name) self.file_handler = open(self.file_name, "r") return self.file_handler def __exit__(self, exc_type, exc_val, exc_tb): """exitæ¹æ³ï¼å ³éæä»¶å¹¶è¿åTrue""" print("exit:", exc_type, exc_val, exc_tb) if self.file_handler: self.file_handler.close() return True # 使ç¨å®ä¾ with MyOpen("python_base.py") as file_in: for line in file_in: print(line) raise ZeroDivisionError # 代ç åä¸ä¸»å¨å¼åä¸ä¸ªé¤é¶å¼å¸¸ï¼ä½æ´ä¸ªç¨åºä¸ä¼å¼åå¼å¸¸ # å ç½®åºcontextlibçä½¿ç¨ @contextlib.contextmanager def open_func(file_name): # __enter__æ¹æ³ print("open file:", file_name, "in __enter__") file_handler = open(file_name, "r") yield file_handler # __exit__æ¹æ³ print("close file:", file_name, "in __exit__") file_handler.close() return # 使ç¨å®ä¾ with open_func("python_base.py") as file_in: for line in file_in: print(line) break # å ç½®åºcontextlibçä½¿ç¨ class MyOpen2(object): def __init__(self, file_name): """åå§åæ¹æ³""" self.file_handler = open(file_name, "r") return def close(self): """å ³éæä»¶ï¼ä¼è¢«èªå¨è°ç¨""" print("call close in MyOpen2") if self.file_handler: self.file_handler.close() return # 使ç¨å®ä¾ with contextlib.closing(MyOpen2("python_base.py")) as file_in: pass