在context manager中,必须要介绍两个概念:

with as... , 和 enterexit.

下文将先介绍with语句,然后介绍 enter__和__exit, 最后介绍context manager.

  • with语句的作用

    它的好处是自动运行try finally语句,从而不需要人工去处理异常。

示例:

with open('some_file', 'w') as  opened_file:
opened_file.write('Hola!')

等同于:

file = open('some_file', 'w')
try:
file.write('Hola!')
finally:
file.close()

首先我们自己实现一个一般情况下的context manager。

class File(object):
def __init__(self, file_name, method):
self.file_obj = open(file_name, method)
def __enter__(self):
return self.file_obj
def __exit__(self, exc_type, exc_value, traceback):
# 三个参数是在运行过程中能引起异常的情况。 当context能够正常退出时,是哪个参数都为None.
self.file_obj.close()

当运行with语句时

with File('demo.txt', 'w') as opened_file:
opened_file.write('Hola!')

运行过程:

1、先运行 __init__ 生成文件句柄 opened_file

2. __enter__方法打开文件并且返回文件对象。

3. 将文件对象传递给句柄opened_file

4. 写文件调用.write()

5. with语句调用后__exit__,关闭这个文件。

tips:

可以补充代码在__enter____exit———— 中,这样在对文件操作的开始和退出时进行相应的动作。

另一种context manager的使用方式

使用contextlib模块。它将contextmanager当作decorator和generator使用。不需要自己构造类,写__enter____exit__函数。

示例代码:

from contextlib import contextmanager

@contextmanager
def open_file(name):
f = open(name, 'w')
yield f
f.close() with open_file('some_file') as f:
f.write('hola!')

open_file()是一个generator,

同时他作为decorator-- contextmanager的参数。

当我们运行with语句时,contextmanager会自动运行__enter____exit__.

同时写入文件是通过genarator来实现的。

Python之 context manager的更多相关文章

  1. Python——with语句、context manager类型和contextlib库

    目录 一.with语句 二.上下文管理器 三.contextlib模块 基本概念 上下文管理协议(Context Management Protocol) 包含方法 __enter__() 和 __e ...

  2. Python Study(02)之 Context Manager

    上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围.一旦对象进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它 ...

  3. Python上下文管理器(context manager)

    上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语 ...

  4. pythonic context manager知多少

    Context Managers 是我最喜欢的 python feature 之一,在恰当的时机使用 context manager 使代码更加简洁.清晰,更加安全,复用性更好,更加 pythonic ...

  5. Android的Context Manager(服务管理器)源码剖析-android学习之旅(99)

    Context Manager介绍 Context Manager对应的进程是servicemanager进程,它先于Service Server和服务客户端运行,进入接收IPC数据的待机状态,处理来 ...

  6. Python - Context Manager 上下文管理器

    什么是上下文管理器 官方解释... 上下文管理器是一个对象 它定义了在执行 with 语句时要建立的运行时上下文 上下文管理器处理进入和退出所需的运行时上下文以执行代码块 上下文管理器通常使用 wit ...

  7. Appium+python自动化9-SDK Manager

    前言 SDK Manager到有哪些东西是必须安装的呢? 一.SDK Manager 1.双击打开SDK Manager界面

  8. 第一个 Python 程序 - Email Manager Demo

    看了一些基础的 Python 新手教程后,深深感觉到 Python 的简洁与强大,这是我的第一个 Python Demo.下面是完整代码与执行截图. 代码: # encoding: utf-8 ''' ...

  9. 六、python中context.get()方法

    例:context.get('variant',False) 意思是如果context中不包括variant 就返回False.

随机推荐

  1. mimikazhi Kerberos Modules

    Kerberos Modules 1.   .#####.   mimikatz 2.0 alpha (x64) release "Kiwi en C" (Oct  9201500 ...

  2. 毕业设计预习:VHDL入门知识学习(一) VHDL程序基本结构

    VHDL入门知识学习(一) VHDL程序基本结构 简介 VHDL程序基本结构 简介 概念: HDL-Hardware Description Language-硬件描述语言-描述硬件电路的功能.信号连 ...

  3. mvc4同一视图传入两个模型

    http://bbs.csdn.net/topics/390961335 用ViewModel,把内容和评论构造到一个类中 这个简单,定义一个模型,包含两个属性,各自为那两个模型的类型,用这个模型.比 ...

  4. python安装pip、numpy、scipy、statsmodels、pandas、matplotlib等

    1.安装python 2.安装numpy(开源的数值计算扩展,可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多. 很多库都是以此库为依 ...

  5. Qt ------ QPainter 和控件组件的重绘

    使用 QPainter 修改 QPaintDevice 的子类,如果 QPaintDevice 的子类也是 QWidget 的子类,比如自定义QWidget子类.QLabel等,需要把 QPainte ...

  6. Autolayout下使用代码改变frame无效

    在使用自动布局的情况下,子视图的边框无法改变.就算调用setFrame方法也不会有效果.自动布局引擎对于子视图的大小和位置有最终的决定权.如果你需要在运行时改变边框,那就得用NSLayoutConst ...

  7. webapi框架搭建-安全机制(二)-身份验证

    webapi框架搭建系列博客 身份验证(authentication)的责任是识别出http请求者的身份,除此之外尽量不要管其它的事.webapi的authentication我用authentica ...

  8. bzoj千题计划129:bzoj2007: [Noi2010]海拔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2007 1.所有点的高度一定在0~1之间, 如果有一个点的高度超过了1,那么必定会有人先上坡,再下坡, ...

  9. Linux启动的流程

    2017年1月10日, 星期二 Linux启动的流程   null

  10. 不用 Twitter Bootstrap 的5个理由

    在以前我们的博客文章中,我们讨论了在web设计和开发项目中使用Twitter Bootstrap的好处.Twitter Bootstrap也有很多的缺点.让我们看看这些主要的问题: 1,它不遵循最佳实 ...