• Python中with的用法


    上下文管理器

      上下文管理器是指符合上下文协议的一个类(类中实现了__enter__方法和__exit__方法)。即可以在一段代码执行前,先执行__enter__中的代码用于预处理,执行完这段代码之后再执行__exit__中的代码进行清理工作。比如入栈、出栈,打开数据库、关闭数据库,打开文件、关闭文件等操作都可以用上下文管理器来完成。

    上下文管理器格式

    class A():
        def __enter__(self):
            print('连接')
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('断开连接')
            if(exc_tb):
                print('出现异常')
            else:
                print('无异常')
            return True
    • __enter__方法实现资源的连接过程
    • __exit__方式实现了资源的断开过程
    with A() as b:
        # 相关操作代码放这里
    -------------------------
    with A():
        # 相关操作代码放这里
    • 在with语句中的操作代码执行前,先执行__enter__中的代码;操作代码执行完后,再执行__exit__中的代码
    • __enter__=>with=>__exit__

    相关参数

    • 在 with A() as b 中,b的值为__enter__方法的返回值,一般情况下会写self即返回上下文管理器对象本身,但是也可以返回其他内容
    • __exit__方法中的参数除了self外还必须有exc_type,exc_val,exc_tb;当操作代码部分没有出现异常时,三个参数的值都为空,当操作代码部分出现异常时分别传入异常的类型、信息、错误堆栈
    • __exit__的返回值可以是True或False,当返回True时若操作代码出现异常则在with语句外将不会给出异常(在__exit__中处理异常),当返回False时若操作代码出现异常则在with语句外给出异常(由外部处理异常)

    示例

    class DataBase():
        def query(self):
            print('查询数据库')
    
        def __enter__(self):
            print('连接数据库')
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('断开数据库连接')
            if(exc_tb):
                print('出现异常')
            else:
                print('无异常')
            return True
    
    with DataBase() as db:
        db.query()
    # 结果:
    # 连接数据库
    # 查询数据库
    # 断开数据库连接
    # 无异常
  • 相关阅读:
    idea语法检查红线隐藏配置
    spring security
    linux centos7下安装fastdfs
    定时任务在多个服务实例之间最多只执行一次
    C++11:01auto关键字
    chap3 数组 #C
    django之模型层 各种查询 数据库查询优化相关 事务使用
    django orm 中表与表之间建关系 视图层 路由层 django请求生命周期
    django 静态文件的配置 orm 中 字段与数据的增删改查 使用MySQL数据库
    BOM,DOM, JS,JQ
  • 原文地址:https://www.cnblogs.com/dancesir/p/15710707.html
Copyright © 2020-2023  润新知