diff --git a/README.md b/README.md index d90f0b1..fb8ace5 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,8 @@ ### python_magic_methods: Python进阶: 实例讲解Python中的魔法函数(Magic Methods) ### python_restful_api.py: 利用Python和Flask快速开发RESTful API + +### python_context.py: With语句和上下文管理器ContextManager =================================================================================================== ### 您可以fork该项目, 并在修改后提交Pull request diff --git a/python_context.py b/python_context.py new file mode 100644 index 0000000..479051a --- /dev/null +++ b/python_context.py @@ -0,0 +1,78 @@ +# _*_ 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