Python的with用法理解
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用法理解的更多相关文章
- python 中@ 的用法【转】
这只是我的个人理解: 在Python的函数中偶尔会看到函数定义的上一行有@functionName的修饰,当解释器读到@的这样的修饰符之后,会先解析@后的内容,直接就把@下一行的函数或者类作为@后边的 ...
- Python关于self用法重点分析
在介绍Python的self用法之前,先来介绍下Python中的类和实例…… 我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以 ...
- python x[:] x[::]用法总结
python x[:] x[::]用法总结 X[:,0] # 二维数组取第1维所有数据 X[:,1] # 第2列 X[0,:] # 第1行 X[3,:] # 第三行 X[1:4,:] # 第一二三行 ...
- 【python】self用法详解
在介绍Python的self用法之前,先来介绍下Python中的类和实例我们知道,面向对象最重要的概念就是类(class)和实例(instance). 类是抽象的模板,比如学生这个抽象的事物,可以用一 ...
- 用Python 的一些用法与 JS 进行类比,看有什么相似?
Python 是一门运用很广泛的语言,自动化脚本.爬虫,甚至在深度学习领域也都有 Python 的身影.作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数.解构赋值. ...
- Python中flatten用法
Python中flatten用法 原创 2014年04月16日 10:20:02 标签: Python / flatten 22667 一.用在数组 >>> a = [[1,3],[ ...
- Python高阶用法总结
目录 1. lambda匿名函数 1.1 函数式编程 1.2 应用在闭包 2. 列表解析式 3. enumerate内建函数 4. 迭代器与生成器 4.1 迭代器 4.3 生成器 5. 装饰器 前言: ...
- 详解python中@的用法
python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,‘@function'作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 ...
- python map 的用法
map的用法 ——.我们来分析map在python的源码 class map(object): """ map(func, *iterables) --> map ...
随机推荐
- OpenSAML
一.背景知识: SAML即安全断言标记语言,英文全称是Security Assertion Markup Language.它是一个基于XML的标准,用于在不同的安全域(security domain ...
- 【JAVA并发编程实战】3、同步容器
同步容器包括Vector和Hashtable,还有一些由Collections.synchronizedXxx等工厂方法创建的 1.同步容器类的问题 同步容器类都是线程安全的,但是有些时候还是要客户端 ...
- 初识Spring MVC
1.什么是Spring MVC? Spring MVC属于SpringFrameWork的后续产品,它提供了构建 Web 应用程序的全功能 MVC 模块,与Struts2一样是一种优秀MVC框架,不同 ...
- PHP7新增 功能
php7发布已有半月,最近有时间了解一下php7的新特性,当然,这个版本最大的特点是性能的提升.在下并非高手,欢迎大家指出错误,同时期待共同交流 1.在use语句增加了group支持use FooLi ...
- canvas实现抽奖大转盘
这里不给用JS,下面地址有效果以及详细代码 效果地址:http://sandbox.runjs.cn/show/d2et4rys
- eclipse Swt编程—窗口小部件widget
1.标签Label // 标签(Label类)组件是SWT中最简单的组件.Label类的构造方法和格式如下: // Label(Composite parent,
- SharePoint 2013 自定义扩展菜单
在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbo ...
- 用Kotlin开发Android应用(II):创建新项目
这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...
- 【代码笔记】iOS-下拉菜单
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- iOS之触摸及手势
触摸事件 iOS中的事件: 在用户使用app过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: view的触摸事件处理: 响应者对象: 在iOS中不是任何对象都能处理事件,只有继承了 ...