简介

  1. with是从Python2.5引入的一个新的语法,它是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关代码统统去掉,简化try….except….finlally的处理流程。
  2. with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常。所以使用with处理的对象必须有__enter__()__exit__()这两个方法。
  3. with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。举例如下:
    # 打开1.txt文件,并打印输出文件内容
    with open('1.txt', 'r', encoding="utf-8") as f:
    print(f.read())

    看这段代码是不是似曾相识呢?是就对了!

With...as语句的基本语法格式:

with expression [as target]:
with_body

参数说明:

expression:是一个需要执行的表达式;

target:是一个变量或者元组,存储的是expression表达式执行返回的结果,[]表示该参数为可选参数。

With...as语法的执行流程

  1. 首先运行expression表达式,如果表达式含有计算、类初始化等内容,会优先执行。
  2. 运行__enter()__方法中的代码
  3. 运行with_body中的代码
  4. 运行__exit()__方法中的代码进行善后,比如释放资源,处理错误等。

实例验证

#!/usr/bin/python3
# -*- coding: utf-8 -*- """ with...as...语法测试 """
__author__ = "River.Yang"
__date__ = "2021/9/5"
__version__ = "1.1.0" class testclass(object):
def test(self):
print("test123")
print("") class testwith(object):
def __init__(self):
print("创建testwith类")
print("") def __enter__(self):
print("进入with...as..前")
print("创建testclass实体")
print("")
tt = testclass()
return tt def __exit__(self, exc_type, exc_val, exc_tb):
print("退出with...as...")
print("释放testclass资源")
print("") if __name__ == '__main__':
with testwith() as t:
print("with...as...程序内容")
print("with_body")
t.test()

程序运行结果

创建testwith类

进入with...as..前
创建testclass实体 with...as...程序内容
with_body
test123 退出with...as...
释放testclass资源

代码解析

  1. 这段代码一共创建了2个类,第一个testclass类是功能类,用于存放定义我们需要的所有功能比如这里的test()方法。
  2. testwith类是我们用来测试with...as...语法的类,用来给testclass类进行善后(释放资源等)。
  3. 程序执行流程
st=>start: 开始框
op=>operation: 处理框
cond=>condition: 判断框(是或否?)
sub1=>subroutine: 子流程
io=>inputoutput: 输入输出框
e=>end: 结束框
st->op->cond
cond(yes)->io->e
cond(no)->sub1(right)->op
graph TD
A[方形] --> B(圆角)
B --> C{条件a}
C --> |a=1| D[结果1]
C --> |a=2| E[结果2]
F[竖向流程图]
flowchat
st=>start: 开始
e=>end: 结束
op=>operation: 创建testwith类,执行类初始化函数
op1=>operation: 进入`__enter__()`,创建testclass类
op2=>operation: 调用testclass中的test()方法
op3=>operation: 进入__exit__(),释放资源

st->op->op1->op2->op3
op3->e





欢迎各位老铁一键三连,本号后续会不断更新树莓派、人工智能、STM32、ROS小车相关文章和知识。

大家对感兴趣的知识点可以在文章下面留言,我可以优先帮大家讲解哦

原创不易,转载请说明出处。

Python中with...as...的用法详解的更多相关文章

  1. python中os.walk的用法详解

    python中os.walk是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 1.载入要使用os.walk,首先要载入该函数 可以使用以下两种方法 import os f ...

  2. Python中scatter函数参数用法详解

    1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如下: 4.基本的使用方法如下: #导入必要的模块 import numpy as np import matp ...

  3. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  4. SVN中tag branch trunk用法详解

    SVN中tag branch trunk用法详解 2010-05-24 18:32 佚名 字号:T | T 本文向大家简单介绍一下SVN中tag branch trunk用法,SVN中tag bran ...

  5. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  6. delphi中Application.MessageBox函数用法详解

    delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...

  7. **Python中的深拷贝和浅拷贝详解

    Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

  8. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

  9. Python中的变量和作用域详解

    Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...

随机推荐

  1. 启动或重启Oracle数据以及监听

    (以下均为命令行形式) 1.切换到oracle数据库用户: su - oracle 2.查看数据库的监听状态: lsnrctl status 3.停止监听: lsnrctl stop 4.登陆到ora ...

  2. 第6篇-Java方法新栈帧的创建

    在 第2篇-JVM虚拟机这样来调用Java主类的main()方法 介绍JavaCalls::call_helper()函数的实现时提到过如下一句代码: address entry_point = me ...

  3. shell脚本——awk

    目录 一.awk 1.1.awk简介 1.2.基本格式 1.3.工作原理 1.4.常见的内建变量(可直接用) 按字段输出文本 1.5.awk和getline 有重定向符 无重定向符 1.6.指定分隔符 ...

  4. Golang语言系列-18-Gin框架博客项目

    代码托管在码云: https://gitee.com/lichengguo/my-blog-golang

  5. miniFTP项目实战二

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  6. 题解 Defence

    传送门 发现最少次数只和最左,最右及中间最长的全0段有关 本来想启发式合并,结果发现直接线段树合并搭配一个类似山海经的方法就可以过了 yysy,线段树单次合并的具体复杂度并不是 \(O(logn)\) ...

  7. 遇到的C++ cli 转 C++ native 为C# 程序提供接口。

    接口文件 /*++ (do not edit the above line) ************************************************************* ...

  8. 【java虚拟机】内存分配与回收策略

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6557473.html 前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老 ...

  9. Mac Ideal 常用快捷键

    智能提示 ⌘ -> command ⇧ -> shift ⌥ -> option -> 上箭头 -> 下箭头 ⌃ -> Control mac的option键  = ...

  10. linux 常用命令(四)——(centos7-centos6.8)Vim安装

    centos是默认安装了vi编辑器的,vim编辑器是没安装或者未完全安装的,个人习惯用vim,所以记录一下vim编辑器的安装: 1.查看vim相关软件信息: yum search vim 2.在线安装 ...