Python之__enter__和__exit__

1. 概述

这两个函数与with as语句语句紧密相连,即

class Test():def __enter__(self):print("Enter!")passdef __exit__(self, type, value, trace):print("Exit!")passwith Test() as f:       
# 执行with as语句时,Test类中的__enter__函数会被调用,__enter__函数返回的对象成为fprint("f:", f)print("Have a try!")

在以上例子中,执行顺序如下

  • 执行with as语句时,Test类中的__enter__函数会被调用,因此首先会打印"Enter!"
  • __enter__函数返回的对象成为f,这里__enter__函数没有return语句,默认返回None,因此f就是None
  • 然后打印"Have a try!"
  • 当with as语句执行完毕以后,__exit__函数会被调用,因此最后打印"Exit!"

所以最后的执行结果如下,

Enter!
f: None
Have a try!
Exit!

2. __exit__函数的三个参数

我们注意到__exit__函数中除了self参数外,还有三个参数type, value, trace,这三个参数有什么用呢?这三个参数是处理异常的,也就是在执行with as语句块中,如果遇到异常,会马上进入__exit__函数。例如,


class Test():def __init__(self):print("Init!")def __enter__(self):print("Enter!")return "F"def __exit__(self, type, value, trace):print("type:", type)print("value:", value)print("trace:", trace)print("Exit!")return True# 这里返回True意味着with as语句块后面的代码会继续执行# 但是with as语句块内部,产生异常之后的代码不会执行with Test() as f:  # 执行with as语句时,Test类中的__enter__函数会被调用,__enter__函数返回的对象成为fprint("f:", f)a = 1 / 0print("Have a try!")  # 猜猜这句话会不会执行呢?print("Done!")  # 猜猜这句话会不会执行呢?
  • 执行with as语句时,Test类中的__enter__函数会被调用,因此首先会打印"Enter!"
  • __enter__函数返回的对象成为f,这里__enter__函数有return语句,返回F,因此f就是F
  • 执行a = 1 / 0会出现异常,直接进入__exit__函数,打印出相应的type,value,traceback和"Exit!"
  • 由于已经进入__exit__函数,with as语句块中后面的内容将不再执行,因此不会打印"Have a try!"

注意,在__exit__函数返回了True,这意味着with as语句块后面的内容将继续执行,因此会打印"Done!"
最后的执行结果如下

Init!
Enter!
f: F
type: <class 'ZeroDivisionError'>
value: division by zero
trace: <traceback object at 0x0000017F773D4288>
Exit!
Done!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/577961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git中的smart checkout和force checkout

切换分支时出现了这个问题&#xff1a; 这是因为shiyan01分支修改了代码,但是没有commit, 所以在切换到test分支的时候弹出这个窗口 一、smart checkout(智能签出) 会把shiyan01分支的改动内容带到test分支。合并处理后的内容就变成了test分支的内容,而shiyan01分支的改动会被…

【Qt-编码】

Qt编程指南 ■ 编码■ ASCII■ ANSI■ GB2312■ GBK■ GB18030 编码■ Unicode■ UTF-8&#xff1a; ■ Qt接收注射泵GBK编码后显示乱码■■ ■ 编码 ■ ASCII &#xff08;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码&#xff09;…

LH7904D 太阳能警示灯 0.4W×2

应用范围: 可安装在电线杆&#xff0c;路灯&#xff0c;围挡&#xff0c;交 通护栏及各种杆式固体等场所起警示作用。 产品特点&#xff1a; 采用进口PS材质; 光控无开关&#xff0c;白天不闪&#xff0c;昏暗环境自动闪烁&#xff0c;无需手动操作&#xff0c;省时省事; …

L4S 杂谈

这不是技术文档&#xff0c;这是技术以外的文档。 带宽资源越来越丰富时&#xff0c;大家反而不抢了&#xff0c;资源越稀缺争抢越厉害&#xff0c;相比丰盈的带宽&#xff0c;如今人们更关注时延。l4s 提供了完全不同的方案。但梳理一下传统方法是必要的。 30 多年来&#x…

SpringBoot Gateway整合过程中的问题

现象描述&#xff1a; 第一次请求正常&#xff0c;第二次报错&#xff0c;错误如下&#xff1a; 2023-12-25 00:47:46.928 ERROR 5484 --- [ctor-http-nio-6] a.w.r.e.AbstractErrorWebExceptionHandler : [34ab38d8-2] 500 Server Error for HTTP GET "/gateway/config…

Oracle 学习(2)

过滤和排序数据 where条件过滤 日期格式 查询10号部门的员工信息&#xff1a;SQL> select * from emp where deptno10 查询”KING”的信息&#xff1a;SQL> select * from emp where ename KiNg 未选定行。 注意&#xff1a;字符串大小写敏感。 SQL> selec…

Navicat误删除生产环境SQLServer2012单表数据后恢复单表数据

背景&#xff1a; 1-后端更新功能部署到客户生产环境时误将测试环境数据保留&#xff0c;项目负责人发现后告知后端。 2-后端登录客户生产数据库使用navicat删除一张表的单表数据时多删了几条数据&#xff0c;判断弄乱了客户生产环境下自己产生的单表数据。 思路&#xff…

直通车定义、功能以及扣费原则

1.直通车是天猫付费搜索广告&#xff0c;即时需求&#xff0c;是消费者主动来搜索的&#xff0c;cpc扣费原则&#xff0c;一般用来拉新或者收割客户&#xff1b; 2.一般关键词优先&#xff0c;人群溢价是用来更精准投放的&#xff0c;可以不投溢价人群&#xff1b; 3.溢价人群…

什么是数据分析思维

参考 一文学会如何做电商数据分析&#xff08;附运营分析指标框架&#xff09; 电子商务该如何做数据分析&#xff1f;如何数据分析入门&#xff08;从各项指标表象进入&#xff09; https://www.processon.com/outline/6589838c3129f1550cc69950 数据分析步骤 什么是数据分析…

IP 地址归属地查询

IP 地址归属地查询 1. IP 地址归属地查询2. IP 地址归属地查询References 1. IP 地址归属地查询 https://tool.lu/ip/index.html 2. IP 地址归属地查询 https://www.ip.cn/ip/.html References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【FPGA】分享一些FPGA高速信号处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

Unity | 渡鸦避难所-4 | 镜头跟随角色移动

1 Cinemachine 简介 在第一人称视角的游戏中&#xff0c;摄像机需要时刻跟随角色移动。除了手动计算摄像机的位置、旋转外&#xff0c;也可以使用 Unity 提供的 Cinemachine 插件来轻松实现摄像机的控制 Cinemachine 是一套用于操作 Unity 相机的模块&#xff0c;解决了跟踪目…

分布式系统架构设计之分布式数据管理

随着互联网时代的不断发展&#xff0c;分布式系统架构成为支撑大规模用户和高并发访问的基础。在构建分布式系统时&#xff0c;分布式系统有着一系列的要求以及对应的核心技术&#xff0c;涉及到数据管理、通信安全性、性能优化、可扩展性设计以及架构演进与版本管理等很多方面…

vs c++mysql 配置

C/C访问MySQL数据库_c链接数据库陈子青-CSDN博客

【使用Ubuntu编译FFmpeg生成Android动态库/静态库】

环境 我这里使用windows里的wsl2的ubuntu&#xff0c;使用物理机或者vmware&#xff0c;vbox之类的安装的ubuntu理论上也可以. gcc编译使用的环境如下: Ndk使用17 FFmpeg使用4.0.2. clang编译使用的环境如下: Ndk使用21.4 FFmpeg使用6.1 FFmpeg下载地址:https://ffmpeg.org/…

什么是pca降维

当执行主成分分析&#xff08;PCA&#xff09;降维时&#xff0c;具体的步骤如下&#xff1a; 1.数据准备&#xff1a; 2.数据集&#xff1a;有一个包含多个样本和特征的数据集。每个样本都是一个向量&#xff0c;每个特征都是向量的一个维度。 3.数据中心化&#xff1a;计算每…

Shell 脚本基础

Shell脚本 脚本以#!/bin/bash开头 执行方式 直接使用文件名执行&#xff1a;文件需要执行权限 以bash xxx.sh来执行, 本质上是bash解析器去执行, 文件作为一个输入, 因此可以不需要执行权限 变量 系统变量 自定义变量 定义变量 # 定义一个变量username, 注意不能有多余…

实战 9 权限菜单管理

目录 1、权限菜单后端接口 2、查询权限菜单列表 2.1 设计效果图 2.2 menuList.vue 3、 新增权限菜单 3.1 新增权限菜单窗口代码 3.2 选择所属菜单代码 3.3 封装图标选择器 3.4 新增、编辑和删除权限菜单 1、权限菜单后端接口 package com.cizhu.service;import com.ci…

[职业管理] OKR

推荐书籍 书名&#xff1a;OKR工作法&#xff1a;谷歌、领英等顶级公司的高绩效秘籍 作者&#xff1a;克里斯蒂娜沃特克 译者&#xff1a;明道团队 文章目录 OKR介绍OKR文档模板OKR周报模板使用OKR进行团队合作 OKR介绍 OKR是"Objectives and Key Results"的缩写&am…

C# WPF上位机开发(子窗口通知父窗口更新进度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 这两天在编写代码的时候&#xff0c;正好遇到一个棘手的问题&#xff0c;解决之后感觉挺有意义的&#xff0c;所以先用blog记录一下&#xff0c;后…