Python的with理解

标签(空格分隔): Python


with做为一种上下文管理器,在Python中的作用可以简单的理解为是用来代替try...except...finally的处理流程。

with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常。对于一些需要预先设置,事后要清理的一些任务,with提供了一种非常方便的表达。在紧跟with后面的语句被求值运算后,会调用运算返回对象的__enter__方法,并将__enter__的返回结果赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用返回对象的__exit__()方法执行清理工作。

就像在文件操作中:

file = open("file.txt")
try:
data = file.read()
finally:
file.close()

在使用了with...as...后,代码将精简为:

with open("file.txt") as file:
data = file.read()

在上面的代码中,open()函数会返回一个类型为file的对象,该对象具有__enter____exit__方法(可以通过dir(file),type(file)查看),之后调用对象的__enter__方法,将返回值赋值给file变量,所以在使用with...as...操作文件时不需要显示的关闭文件。

既然知道with...as...中最重要的就是__enter__exit__,那我们就可以来自定义一个上下文管理器。

其中:
__enter__方法将在进入代码块前被调用。
__exit__将在离开代码块之后被调用(即使在代码块中遇到了异常)。
class WithDemo:
def __enter__(self):
print "in __enter__"
return "WithDemo" def __exit__(self, type, value, trace):
print "in __exit__" def get_demo_with():
return WithDemo() with get_demo_with() as demo:
print "demo:", demo

执行结果为:

in __enter__
demo:WithDemo
in __exit__

在刚开始的时候就已经说,with..as..可以用来代替try...except...finally...的流程操作,上面都在说try...finally...的情况,那异常呢?如果仔细点会发现__exit__()的参数有三个,这三个参数便是为异常提供处理的参数。

class WithDemo:
def __enter__(self):
return self def __exit__(self, type, value, trace):
print "type:", type
print "value:", value
print "trace:", trace def create_trace(self):
return (1/10) + 10 with WithDemo() as demo:
demo.create_trace()

跑一下代码就能发现代码打印出了type, value, trace。

Python的with用法理解的更多相关文章

  1. python 中@ 的用法【转】

    这只是我的个人理解: 在Python的函数中偶尔会看到函数定义的上一行有@functionName的修饰,当解释器读到@的这样的修饰符之后,会先解析@后的内容,直接就把@下一行的函数或者类作为@后边的 ...

  2. Python关于self用法重点分析

    在介绍Python的self用法之前,先来介绍下Python中的类和实例…… 我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以 ...

  3. python x[:] x[::]用法总结

    python x[:] x[::]用法总结 X[:,0] # 二维数组取第1维所有数据 X[:,1] # 第2列 X[0,:] # 第1行 X[3,:] # 第三行 X[1:4,:] # 第一二三行 ...

  4. 【python】self用法详解

    在介绍Python的self用法之前,先来介绍下Python中的类和实例我们知道,面向对象最重要的概念就是类(class)和实例(instance). 类是抽象的模板,比如学生这个抽象的事物,可以用一 ...

  5. 用Python 的一些用法与 JS 进行类比,看有什么相似?

    Python 是一门运用很广泛的语言,自动化脚本.爬虫,甚至在深度学习领域也都有 Python 的身影.作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数.解构赋值. ...

  6. Python中flatten用法

    Python中flatten用法 原创 2014年04月16日 10:20:02 标签: Python / flatten 22667 一.用在数组 >>> a = [[1,3],[ ...

  7. Python高阶用法总结

    目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...

  8. 详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,‘@function'作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 ...

  9. python map 的用法

    map的用法 ——.我们来分析map在python的源码 class map(object): """ map(func, *iterables) --> map ...

随机推荐

  1. Cats(1)- 从Free开始,Free cats

    cats是scala的一个新的函数式编程工具库,其设计原理基本继承了scalaz:大家都是haskell typeclass的scala版实现.当然,cats在scalaz的基础上从实现细节.库组织结 ...

  2. GA算法-R语言实现

    旅行商问题 北工商-经研143班共有30位同学,来自22个地区,我们希望在假期来一次说走就走的旅行,将所有同学的家乡走一遍.算起来,路费是一笔很大的花销,所以希望设计一个旅行方案,确保这一趟走下来的总 ...

  3. 前端实战Demo:一张图片搞定一页布局

    对前端程序员来说,从设计师的手中拿过设计图和素材之后根据需要进行切图是必要的基本功,但是一般的程序员可能对切图并非那么熟悉,所以可能有很多时间都花在使用Photoshop上,那么这里就有一种方法可以减 ...

  4. JS字符串反序输出

    function IsReverse(text){ return text.split('').reverse().join(''); } IsReverse("你是我的小丫小苹果" ...

  5. rem计算适配

    git地址:https://github.com/wjf444128852/about-web-rem 建议在CSS引入之前引入下面这段JS代码,比例1rem:100px. 用了这个JS就不用在CSS ...

  6. 去除GridView选中时的蓝色背景

    解决办法: android:listSelector="#00000000" android:listSelector="@android:color/transpare ...

  7. 三种POST和GET的提交方式

    向服务器提交数据有两种方式,post和get.两者的区别主要有三点,安全性.长度限制.数据结构.其中get请求安全性相比较而言较差,数据长度受浏览器地址栏限制,没有方法体.两种都是较为重要的数据提交方 ...

  8. iOS多线程实现4-NSOperation

    原文链接:http://www.cnblogs.com/mddblog/p/4816875.html 一.介绍 NSOperation是一个抽象类,我们可以使用系统提供的子类或者自己实现它的子类,具有 ...

  9. ToolBar和DrawerLayout的使用实现侧拉栏抽屉的开闭

    1.如图可以看到textColorPrimary,colorPrimary,colorPrimaryDark,navigationBarColor等颜色属性代表的相应位置,如下图 2.具体属性在res ...

  10. 1、软件工程师要阅读的书籍 - IT软件人员书籍系列文章

    软件工程师要阅读的书籍估计是项目组内最多的.软件工程师处于项目组中最基础的人员储备阶层,与项目的关系最密切.当然,现在是大数据时代,我们无法全部看完所有相关的书籍,只能够先学习工作需要的知识,然后在项 ...