1. 上下文管理器

一个类只要实现了 __enter__()__exit__() 这个两个方法,通过该类创建的对象我们就称之为上下文管理器。

上下文管理器可以使用 with 语句,with语句之所以这么强大,背后是由上下文管理器做支撑的,也就是说刚才使用 open 函数创建的文件对象就是就是一个上下文管理器对象。

自定义上下文管理器类,模拟文件操作:

定义一个File类,实现 __enter__()__exit__() 方法,然后使用 with 语句来完成操作文件, 示例代码:

# 自定义上下文管理器类
class File(object):def __init__(self, file_name, file_mode):self.file_name = file_nameself.file_mode = file_modedef __enter__(self):# 上文方法,负责返回操作对象资源,比如:文件对象,数据库连接对象self.file = open(self.file_name, self.file_mode)return self.filedef __exit__(self, exc_type, exc_val, exc_tb):# 下文方法,负责释放对象资源,比如:关闭文件,关闭数据库连接对象self.file.close()print('over')# with语句 结合上下文管理器对象使用
with File('1.txt', 'r') as f:# content = f.read()# print(content)f.write('qqq')  # 报错,但是仍然执行了关闭连接操作

代码说明:

  • __enter__ 表示上文方法,需要返回一个操作文件对象
  • __exit__ 表示下文方法,with语句执行完成会自动执行,即使出现异常也会执行该方法

2. 上下文管理器装饰器方式实现

假如想要让一个函数成为上下文管理器,Python 还提供了一个 @contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 上面的语句在 __enter__ 方法中执行,yield 下面的语句在 __exit__ 方法中执行,紧跟在 yield 后面的参数是函数的返回值。

from contextlib import contextmanager# 加上装饰器,那么下面函数创建的对象就是一个上下文管理器
@contextmanager
def my_open(file_name, file_mode):global filetry:file = open(file_name, file_mode)# yield关键字之前的代码可以认为是上文方法,负责返回操作对象资源yield fileexcept Exception as e:print(e)finally:# yield关键字后面的代码可以认为是下文方法,负责释放操作对象的资源file.close()print('over')# 普通函数不能结合with语句使用
with my_open('1.txt', 'r') as file:# content = file.read()# print(content)file.write('1')

转载于CSDN

Python上下文管理器_南枝向暖北枝寒-CSDN博客​blog.csdn.net

如有侵权请联系删除。

感谢关注和点赞

此上下文中不支持函数定义。请在代码文件中创建函数。_深入解析Python上下文管理器,让你不再迷茫!...相关推荐

  1. python echo函数_python如何调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  2. php找出函数定义位置,WordPress如何快速定位PHP函数所在文件位置及代码行号?

    有时候我们需要修改别人源码里的代码,却找不到对应的函数放在了哪儿,就可以用使用本文介绍的办法,帮你快速定位函数位置.特别是某些写法不规范的WordPress主题,各种模块,函数到处放,找半天的那种.那 ...

  3. 【C++】模板函数的声明和定义必须在同一个文件中

    1.问题描述 习惯性的将函数的定义和实现,分别写在头文件和源文件(.cpp)中.今天也按照这个习惯实现了一个模板函数.然后编译时报错 ... error: undefined reference to ...

  4. 请确保此代码文件中定义的类与“inherits”属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的。...

    编译ASP.NET时,提示"请确保此代码文件中定义的类与"inherits"属性匹配,并且该类扩展的基类(例如Page 或UserControl)是正确的.", ...

  5. 请确保此代码文件中定义的类与“inherits”属性匹配.并且该类扩展的基类(例如 Page 或 UserControl)是正确...

    遇到这个问题 特此记录一下 由于copy   aspx页面 引起的 copy之后   类名实原来那个的跟 你现在的文件名不一样LoginAPI.aspx public partial class yu ...

  6. 函数定义涉及的三要素C语言,(函数定义与三要素答案.doc

    (函数定义与三要素答案 函数定义及三要素 1.与函数y=10lg(2x-1)的图象相同的函数是( ) A.y= B.y=2x-1 C.y= D.y= [答案] B [解析] y=10lg(2x-1)= ...

  7. 习题 8.5 将本章的例8.4改写为一个多文件的程序:1.将类定义放在头文件arraymax.h中;2.将成员函数定义放在源文件arraymax.cpp中;3.主函数放在源文件file1.cpp中。

    C++程序设计(第三版) 谭浩强 习题8.5 个人设计 习题 8.5 将本章的例8.4改写为一个多文件的程序: 1.将类定义放在头文件arraymax.h中: 2.将成员函数定义放在源文件arraym ...

  8. 在Node.js中,如何从其他文件中“包含”函数?

    假设我有一个名为app.js的文件. 很简单: var express = require('express'); var app = express.createServer(); app.set( ...

  9. 劫持 function_core.php,function_core.php文件中常用函数

    雨哲在开发插件的时候喜欢直接调用系统本身有的函数来实现,不太喜欢重复定义相同功能的函数,这里收集一下常用的function_core.php文件中的函数. 1.验证邮箱地址有效性:isemail($e ...

最新文章

  1. jquery.autocomplete自动补全功能
  2. 也说说Silverlight动态加载DLL
  3. PAT甲级1074 Reversing Linked List :[C++题解]反转链表,借用vector
  4. Oracle-SYSAUX表空间解读
  5. 使用 FocusScopeNode 在 TextFormFields 之间轻松移动焦点
  6. LeetCode刷题知识总结
  7. .NET 6新特性试用 | 常量内插字符串
  8. leetcode645. 错误的集合
  9. Gitlab14.x 安装、配置、启动 (Centos/Red Hat7/8.x)
  10. 超轻简洁个人引导页网站源码
  11. Qt Creator 添加自定义注释
  12. win11开机记录如何查看 Windows11查看开机记录的设备方法
  13. 《TCP/IP详解卷1:协议》第12章 广播和多播---读书笔记
  14. 网络编程知识点复习(第一次)
  15. 机器学习为您揭秘雾霾怎么形成
  16. 前后端分离前端框架的主要内容是什么?
  17. 北京林业大学计算机复试难度,2015年北京林业大学考研复试经验
  18. php股票预警,很准的股票底部预警选股指标 通达信公式(附图)
  19. Md5,base64加密
  20. 传统博物馆的自救之路,名画也变NFT

热门文章

  1. “两元故事”后,谭木匠需要新叙事
  2. python open追加模式_Python文件操作,open读写文件,追加文本内容实例
  3. python 结束子线程并保证工作完成_python3中在线程中结束工作进程的方法
  4. 计算机网络拓扑结构的选择规则,赖工为您讲解计算机网络的拓扑结构
  5. 对Python匿名函数和@property小小理解,希望对你学习也有帮助
  6. python字典教程:添加与删除
  7. 阅读类型HTML,W3C HTML5标准阅读笔记 – 元素分类与内容模型(Content Model)
  8. word文档怎么限制编辑(禁止编辑、只读)?
  9. Intel Realsense深度摄像头的自校准功能(self-calibration-for-depth-cameras)
  10. 【图像处理】图像内插“最近邻插值 最近邻内插法(Nearest Neighbour Interpolate)”代码演示(调整图像大小、放大、缩小)