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上下文管理器如何实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注恰卡编程网行业资讯频道。
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...