Python高级——with上下文管理器
with上下文管理器
任何实现了 enter() 和 exit() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。
如果一个一个文件使用普通方式打开:
def m1():f = open("output.txt", "w")f.write("python之禅")f.close()
如果程序执行中碰到错误,会退出程序,可能没有执行f.close(),会造成系统资源的浪费。
如果使用with方式:
with File('out.txt', 'w') as f:print("writing")f.write('hello, python')
如果程序执行中碰到错误,会自动关闭文件。
自定义上下文管理器:
class File():def __init__(self, filename, mode):self.filename = filenameself.mode = modedef __enter__(self):print("entering")self.f = open(self.filename, self.mode)return self.fdef __exit__(self, *args):print("will exit")self.f.close()
实现上下文管理器的另一种方式:
from contextlib import contextmanager@contextmanager
def my_open(path, mode):f = open(path, mode)yield ff.close()
Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 之前的语句在 enter 方法中执行,yield 之后的语句在 exit 方法中执行。紧跟在 yield 后面的值是函数的返回值。
调用:
with my_open('out.txt', 'w') as f:f.write("hello , the simplest context manager")
Python高级——with上下文管理器相关推荐
- python教程:上下文管理器详细教程
我想你对 Python 中的with语句一定不陌生,尤其是在文件的读写操作中,不过我想,大部分人可能习惯了它的使用,却并不知道隐藏在其背后的"秘密". 那么,究竟with语句要怎么 ...
- python 什么是上下文管理器(ContextManager)?
上下文是 context 直译的叫法,在程序中用来表示代码执行过程中所处的前后环境.上下文管理器中有 enter 和 exit 两个方法,以with为例子,enter 方法会在执行 with 后面的语 ...
- 深入理解 Python 中的上下文管理器
图|李思瑶 文|MING 提示:前面的内容较为基础,重点知识在后半段. with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with op ...
- python异常处理与上下文管理器
python异常处理 异常与错误 错误 可以通过IDE或者解释器给出提示的错误 opentxt('a.jpg','r') 语法层面没有问题,但是自己代码的逻辑有问题 if age>18: pri ...
- python 计时器_Python上下文管理器的魔力
点击关注我哦 一篇文章带你了解Python上下文管理器的魔力 小编将为您准备一份很棒的Python上下文管理器使用指南,这将使您的代码更具可读性和可靠性,降低您的错误发生率. 资源管理器是我们在任何编 ...
- python中实现上下文管理器的两种方法
上下文管理器: python中实现了__enter__和__exit__方法的对象就可以称之为上下文管理器 实现方法一举例: def File(object): def __init__(self, ...
- python知识点:上下文管理器[__enter__ 和 __exit__ ]
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/reallocing1/article/details/64526895 上下文管理器(context ...
- Python进阶(上下文管理器与with语句)
/*上下文管理器必须有__enter__和__exit__方法*/ class MyResource:def __enter__(self):print('链接资源')return self/*__e ...
- python进入上下文管理器_浅谈Python中with(上下文管理器)的用法
例子一 首先来看一段代码: classFoo(object):def __init__(self):print('实例化一个对象')def __enter__(self):print('进入')def ...
最新文章
- 解决ModuleNotFoundError: No module named ‘pip‘问题
- Gson把对象转成json格式的字符串
- 安全公司:苹果iOS10备份功能安全性比iOS9差很多
- 泛型 与 实体类的相互转换
- LeetCode(30):与所有单词相关联的字串
- 删除主串中模式串出现的字符
- iPad上面的扫描加水印免费软件推荐
- postman设置带token的请求
- 014箱子开合并移动
- centos桥接模式怎么联网_今日回收 | 互联网+废品回收模式是怎么兴起的呢?
- C++笔记-基于邻接表的BFS(宽度优先遍历)
- mycat 分布式mysql_MySQL 部署分布式架构 MyCAT (五)
- python报数组越界_【问题汇总】列表数组越界的问题
- 高盛集团:金融科技布局
- InnoSetup 制作安装包进阶版
- 底层网工、0基础、记性差,学习CCIE/HCIE,到底是啥体验?
- 第九节 html特殊文字符号
- 内存卡没有Android,安卓内存卡读不出来怎么办
- 【Python 3.7】分子运动:修改 rw_visual.py,将其中的 plt.scatter() 替换为 plt.plot() 。为 模拟花粉在水滴表面的运动路径
- C/C++时间字符串和时间戳的相互转化