20191125:with上下文管理

with是一个上下文管理器,用于执行代码块所需要的运行的时候的上下文入口和出口。上下文管理器的典型用法包括保存和还原各种全局状态,锁定和解锁资源,关闭打开的文件等。

先执行__enter__方法,再执行__exit__方法,当对象被实例化时,就会主动调用__enter__()方法,任务执行完成后就会调用__exit__()方法。

# encoding: utf-8
class mywith:
    def __enter__(self):
        print("mywith enter方法")
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("mywith exit方法")
        print("exc_type",exc_type)
        print("exc_val",exc_val)
        print("exc_tb",exc_tb)
    def tell(self):
        print("tell方法")
if __name__ == '__main__':
    with mywith() as b:
        b.tell()

mywith enter方法

tell方法

mywith exit方法

exc_type None

exc_val None

exc_tb None

__exit__()方法是带有三个参数的(exc_type, exc_value, traceback),如果上下文运行时没有异常发生,那么三个参数都将置为None

如果有异常的情况下执行如下:

class mywith:
    def __enter__(self):
        print("mywith enter方法")
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("mywith exit方法")
        print("exc_type",exc_type)
        print("exc_val",exc_val)
        print("exc_tb",exc_tb)
    # def tell(self):
    #     print("tell
方法")
if __name__ == '__main__':
    with mywith() as b:
        b.tell()

mywith enter方法

mywith exit方法

exc_type <class 'AttributeError'>

exc_val 'mywith' object has no attribute
'tell'

exc_tb <traceback object at
0x00000230DA074C48>

有异常的时候,exc_type输出异常类型,exc_val输出异常的错误信息,exc_tb输出错误的堆栈对象。因此我们可以在__exit__方法中定义异常的处理如下:

if exc_type==AttributeError:
    print("AttributeError被处理")

return True

Tips:!!如果有异常发生,并且该方法希望抑制异常(即阻止它被传播),则它应该返回True,否则,异常将在退出该方法时正常处理。

20191125:Python中的上下文管理机制with的更多相关文章

  1. (转)Python中的上下文管理器和Tornado对其的巧妙应用

    原文:https://www.binss.me/blog/the-context-manager-of-python-and-the-applications-in-tornado/ 上下文是什么? ...

  2. Python中的上下文管理器(contextlib模块)

    上下文管理器的任务是:代码块执行前准备,代码块执行后收拾 1 如何使用上下文管理器: 打开一个文件,并写入"hello world" filename="my.txt&q ...

  3. Python中的上下文管理器和with语句

    Python2.5之后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于规定某个对象的使用范围.本文是针对于该功能的思考总结. 为什么需要上下文管理器? 首先, ...

  4. 深入理解 Python 中的上下文管理器

    提示:前面的内容较为基础,重点知识在后半段. with 这个关键字,对于每一学习Python的人,都不会陌生. 操作文本对象的时候,几乎所有的人都会让我们要用 with open ,这就是一个上下文管 ...

  5. python中实现上下文管理器的两种方法

    上下文管理器: python中实现了__enter__和__exit__方法的对象就可以称之为上下文管理器 实现方法一举例: def File(object): def __init__(self, ...

  6. Python中的内存管理机制

    Python是如何进行内存管理的 python引用了一个内存池(memory pool)机制,即pymalloc机制,用于管理对小块内存的申请和释放 1.介绍 python和其他高级语言一样,会进行自 ...

  7. python中利用上下文管理器来实现mysql数据库的封装

    from pymysql import connect class DB(object): def __init__(self, password, database): # 1.连接数据库 self ...

  8. python中的上下文管理器

    刚刚看了vamei大神的上下文管理器博客,理解如下: 其实我自己经常用到上下文管理器,尤其是在打开文件的时候,如果自己比较懒,不想手工打上f.close(),使用上下文管理器就ok拉. 上下文管理器就 ...

  9. flask你一定要知道的上下文管理机制

    前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...

随机推荐

  1. 【Python 代码】CS231n中Softmax线性分类器、非线性分类器对比举例(含python绘图显示结果)

    1 #CS231n中线性.非线性分类器举例(Softmax) #注意其中反向传播的计算 # -*- coding: utf-8 -*- import numpy as np import matplo ...

  2. Linux/Centos下安装部署phantomjs

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  3. PLSQL命令行创建用户 以及 JDBC简单操作

    目录 PLSQL Developer命令行创建用户以及表 课堂要点 ​ JDBC 主外键约束 踩坑之路 设置ORACLE_HOME环境变量 PLSQL Developer命令行创建用户以及表 打开Co ...

  4. Acer笔记本如何装系统?

    一.准备工作 1.一个有win7或者XP系统的电脑(制作启动盘用) 2.一个8G以上的U盘 3.win7&win8系统包(win8.1下载地址:http://pan.baidu.com/s/1 ...

  5. .gitignore忽略多层文件夹用**

    一.写法 **/bin/Debug/ 前面的两个*号代表任意多层上级文件夹 需要 git 1.8.2 及其以上的版本才支持 如何查看当前版本并且升级(windows) 二.如何升级 git是2.14. ...

  6. B站在微服务治理中的探索与实践

    https://mp.weixin.qq.com/s/_iFe8DO1e-QcYG-CJDTHpg

  7. Windows7 64位配置ODBC数据源(Sybase)的方法

    Windows7 64位配置ODBC数据源(Sybase)的方法 操作步骤: 1,通过“控制面板->ODBC(32位)”进入ODBC数据源管理器,如下图: 假如没找到“ODBC(32位)”,则可 ...

  8. Qt QLabel加载图片

    QLabel加载图片 //在对应的控件中显示图片 void qm_img::DisplayImg(cv::Mat imgParam, QLabel *labelParam) { if (!imgPar ...

  9. c# list 使用Where()方法过滤数据

    //根据任务id过滤数据 Func<RfidCodeResultDto, bool> expression = c => c.lineTaskId == _lineTaskId; r ...

  10. 内层元素设置position:relative后父元素overflow:hidden overflow:scroll失效 解决方法

    内层元素设置position:relative后父元素overflow:hidden overflow:scroll 都失效 解决方法:在position:relative的外层父容器加positio ...