ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

关于python中with语句的粗浅认识

2021-05-15 16:32:55  阅读:182  来源: 互联网

标签:语句 __ 粗浅 管理器 exc python self file 上下文


上下文管理管理器:资源使用完成的释放很重要,python中使用上下文管理器来自动分配并释放资源。with语句操作对象就为一个上下文管理器对象。

基于类的上下文管理器的:

  • 使用类定义一个文件的上下文管理器对象,代码如下:当被with语句使用时会依次执行__init__(),__enter__()方法和__exit__()。
 1 class FileType:
 2     """
 3     使用类创建上下文管理器时必须包含__enter__()和__exit__()方法
 4     """
 5     def __init__(self, name, mode):
 6         self.name = name
 7         self.mode = mode
 8         self.file = None
 9 
10     def __enter__(self):
11         """
12         获取要操作的资源并且返回
13         :return:返回需要被管理的资源
14         """
15         self.file = open(self.name,self.mode)
16         return self.file
17 
18     def __exit__(self, exc_type, exc_val, exc_tb):
19         """
20         对资源的释放或者清理操作放在此方法里面
21         :param exc_type:异常类型
22         :param exc_val:异常值
23         :param exc_tb:异常错误栈信息
24         :return:当返回值为True时,表示告诉python解释器异常已经捕获无需再抛出异常
25         """
26         if exc_type:
27             print(f'exc_type: {exc_type}')
28         if self.file:
29             self.file.close()
View Code

with语句执行上下文管理器:

1 file_manager = FileType("text.txt", "w")
2 # 使用with执行这个文件上下文管理器
3 with file_manager as f:
4     f.write("this is my test.")

基于生成器的上下文管理器:

  • 使用生成器定义上下文管理器,用以支持with语句。其实装饰器内做了处理,也引入了__enter__()和__exit__(),若忘记装饰器则会报错,装饰器的具体实现过程可以查看源码了解。
 1 from contextlib import contextmanager
 2 
 3 
 4 @contextmanager
 5 def file_manager(name, mode):
 6     try:
 7         f = open(name, mode)
 8         yield f
 9     finally:
10         f.close()
11 
12 
13 with file_manager('test.txt', 'w') as f:
14     f.write('hello world')

总结:

  • with语句操作上下文管理器对象;
  • 上下文管理器对象中有打开资源和关闭清理资源的方法,且含有抛出异常功能,注意当不需要抛出异常时,可让返回值为True;
  • 基于类的上下文管理器适合大型系统开发,基于生成器的上下文管理器更加方便简洁,适用于中小程序开发;

 

标签:语句,__,粗浅,管理器,exc,python,self,file,上下文
来源: https://www.cnblogs.com/BinZhou0901/p/14771804.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有