Python上下文管理器如何实现
Python上下文管理器如何实现
今天小编给大家分享一下Python上下文管理器如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
什么时候可以考虑上下文管理器
当你的代码逻辑需要用到如下关键字时,可以考虑使用上下文管理器让你的代码更加优雅:
try:...finally:...
接下来介绍实现上下文管理器的三种方法。
方法1(上下文管理器协议)
总所周知,open()是默认支持上下文管理器的。所以打开一个txt文件,并向里面写入内容,再关闭这个文件的代码可以这样写:
withopen("1.txt","w")asfile:file.write("thisisademo")
这是等同于:
file=Nonetry:file=open("1.txt","w")file.write("thisisademo")finally:file.close()
要在Python中实现with语句的使用,就需要借助上下文管理器协议。也就是需要实现__enter__和__exit__两个魔法方法。
classOpenMyFile(object):def__init__(self,path):self.path=pathdef__enter__(self):print("openingthetxt")self.f=open(self.path,"w")returnselfdef__exit__(self,*args,**kwargs):print("closingthetxt")self.f.close()defwrite(self,string):print("writing...")self.f.write(string)withOpenMyFile("2.txt")asfile:file.write("thisisademo2")#输出:openingthetxtwriting...closingthetxt
同时能够看到本地生成了2.txt文件。需要注意的是,__enter__得return实例对象,不然会报异常:AttributeError: "NoneType" object has no attribute "write"
这是因为Python中的函数默认返回None。
方法2(@contextmanager)
利用contextlib中的contextmanager装饰器。
fromcontextlibimportcontextmanager@contextmanagerdefopen_my_file(path):print("openingthetxt")f=open("3.txt","w")yieldfprint("closingthetxt")f.close()withopen_my_file("3.txt")asfile:file.write("thisisdemo3")#输出:openingthetxtclosingthetxt
在@contextmanager装饰的函数中,需要用yield隔开两个逻辑语句。这里yield出来的对象会被as后面的变量接收。
方法3(contextlib.closing())
利用contextlib中的closing()方法。
fromcontextlibimportclosingclassOpenMyFile(object):def__init__(self,path):print("openingthetxt")self.f=open(path,"w")defwrite(self,string):self.f.write(string)defclose(self):print("closingthetxt")self.f.close()withclosing(OpenMyFile("4.txt"))asfile:file.write("thisisdemo4")#输出:openingthetxtclosingthetxt
与方法1不同。经过closing()方法包装过后,在with语句结束时,会强制调用对象的close()方法。所以使用方法3时,需要定义的方法不是__exit__()而是close()。
以上就是“Python上下文管理器如何实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注恰卡编程网行业资讯频道。
推荐阅读
-
Lightly IDE 快捷键:Python 开发者必学的效率提升操作
-
GitHub Codespaces 模板配置:快速初始化项目环境的技巧
-
Python 类型注解进阶:mypy 静态类型检查与 IDE 集成
-
Python 3.12 模式匹配增强:结构分解与多分支逻辑简化实战
-
Lightly IDE 快捷键定制:Python 开发者专属效率提升方案
-
Python 装饰器高级用法:类装饰器与元类结合实践
-
Python 生成器表达式优化:内存占用与迭代效率平衡技巧
-
Python 类型注解深度:Protocol 协议与泛型类型约束实践
-
Python 3.12 新特性解析:模式匹配增强与性能优化实战
-
Lightly IDE 深度评测:轻量级 Python 开发工具是否适合团队协作?