Python __exit__,__enter__函数with语句的组合应用
__exit__,__enter__函数with语句的组合应用
by:授客 QQ:1033553122
简介
设计对象类时,我们可以为对象类新增两个方法,一个是__enter(self)__,一个是__exit__(self, exc_type, exc_val, exc_tb)。
__enter(self)__
负责返回一个值,该返回值将赋值给as子句后面的var_name,通常返回对象自己,即“self”。函数优先于with后面的“代码块”(statements1,statements2,……)被执行。
__exit__(self, exc_type, exc_val, exc_tb)
执行完with后面的代码块后自动调用该函数。with语句后面的“代码块”中有异常(不包括因调用某函数,由被调用函数内部抛出的异常) ,会把异常类型,异常值,异常跟踪信息分别赋值给函数参数exc_type, exc_val, exc_tb,没有异常的情况下,exc_type, exc_val, exc_tb值都为None。另外,如果该函数返回True、1类值的Boolean真值,那么将忽略“代码块”中的异常,停止执行“代码块”中剩余语句,但是会继续执行“代码块”后面的语句;如果函数返回类似0,False类的Boolean假值、或者没返回值,将抛出“代码块”中的异常,那么在没有捕获异常的情况下,中断“代码块”及“代码块”之后语句的执行
with xxx as var_name:
# 代码块开始
statements1
statements2
……
# 代码块结束
# 代码快后面的语句
statements after code block
代码演示1
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- __author__ = 'laiyu'
- class User(object):
- def __init__(self, username, password):
- self._username = username
- self._password = password
- @property
- def username(self):
- return self._username
- @username.setter
- def username(self, username):
- self._username = username
- @property
- def password(self):
- return self._password
- @password.setter
- def password(self, password):
- self._password = password
- def __enter__(self):
- print('auto do something before statements body of with executed')
- return self
- def __exit__(self, exc_type, exc_val, exc_tb):
- print('auto do something after statements body of with executed')
- if __name__ == '__main__':
- boy = User('shouke', 'shouke2014')
- print(boy.password)
- with User('shouke', '2014') as user:
- print(user.password)
- print('---------end-----------')
- 运行结果
- 如上,代码块运行前调用了__enter__函数,代码块运行完,自动调用了__exit__函数
代码演示2
- 更改上述部分代码如下,继续运行
- def __exit__(self, exc_type, exc_val, exc_tb):
- print('auto do something after statements body of with executed')
- print('exc_type:', exc_type)
- print('exc_val:', exc_val)
- print('exc_tb:', exc_tb)
- return False
- if __name__ == '__main__':
- boy = User('shouke', 'shouke2014')
- print(boy.password)
- with User('shouke', '2014') as user:
- print(user.password)
- 12/0
- print('after execption')
- print('---------end-----------')
- 运行结果
- 对比实验:
- 在上述的基础上继续修改代码
- def __exit__(self, exc_type, exc_val, exc_tb):
- print('auto do something after statements body of with executed')
- print('exc_type:', exc_type)
- print('exc_val:', exc_val)
- print('exc_tb:', exc_tb)
- return True
- if __name__ == '__main__':
- boy = User('shouke', 'shouke2014')
- print(boy.password)
- with User('shouke', '2014') as user:
- print(user.password)
- 12/0
- print('after execption')
- print('---------end-----------')
- 运行结果:
- 注意:
- 1、抛异常后,代码块中剩余的语句没有再继续运行
- 2、如果在上述的基础上,把代码中的 12/0剪切后放到password(self)中,抛出异常的异常信息是不会传递给__exit__函数的
- @property
- def password(self):
- 12/0
- return self._password
- 运行结果如下,
Python __exit__,__enter__函数with语句的组合应用的更多相关文章
- Python常用函数--return 语句
在Python教程中return 语句是函数中常用的一个语句.return 语句用于从函数中返回,也就是中断函数.我们也可以选择在中断函数时从函数中返回一个值.案例(保存为 function_retu ...
- Python python 函数参数:参数组合
'''在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数, 这4种参数都可以一起使用,或者只用其中某些 参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数 ''' d ...
- 【Python学习笔记】with语句与上下文管理器
with语句 上下文管理器 contextlib模块 参考引用 with语句 with语句时在Python2.6中出现的新语句.在Python2.6以前,要正确的处理涉及到异常的资源管理时,需要使用t ...
- python高级之函数
python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...
- python 内置函数和函数装饰器
python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...
- 第一篇:python高级之函数
python高级之函数 python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没 ...
- 八. Python基础(8)--函数
八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x): ' ...
- Python之路(第八篇)Python内置函数、zip()、max()、min()
一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算,如果全部都是true,就返回true, 但是如果是空字符串.空列表也返回t ...
- gj3 Python数据模型(魔法函数)
3.1 什么是魔法函数 类里面,实现某些特性的内置函数,类似 def __xx__(): 的形式. 不要自己定义XX,并不是和某个类挂钩的 class Company(object): def __i ...
随机推荐
- Python - 使用Pylint检查分析代码
1-简介 Home Page : https://www.pylint.org/ 检查语法错误,是否遵守编码风格标准.潜在的问题等: 支持自定义配置:例如显示或隐藏特定的警告,并且可以通过编写插件来添 ...
- System.net.mail.smtpException;服务器提交了协议冲突 服务器响应为:
最近发邮件遇到问题. 主机godaddy 端口 25,80 都可以用 stmp服务器地址:smtpout.secureserver.net 不支持ssl 我就吧 EnableSsl 设置为false了 ...
- Redis(4)---主从复制
Redis主从复制 一.环境搭建 既然是主从复制,那肯定需要多个redis服务器,下面我先创建3个服务器,™的端口号分别是:6379.6380.6381. 1.复制默认配置文件redis ...
- java提高(6)---Serializable
Serializable--初解 一 序列化是干什么的? 我们知道,在jvm中引用数据类型存在于栈中,而new创建出的对象存在于堆中.如果电脑断电那么存在于内存中的对象就会丢失.那么有没有方法将对象保 ...
- Java虚拟机监控命令
熟悉java的人都知道jdk的bin目录中有很多小工具,其中就包括用于监视虚拟机和故障处理的工具,今天就来仔细了解下各个工具的用法 jps JVM Process Status Tool,用于显示指定 ...
- 怎么样使用CLion调试分析MySQL Server
由于在写MySQL日志订阅服务时候,需要确定在什么event之后保存position,所以就开始研究MySQL的源码,刚开始采用最原始的打印输出的方式去调试,然后每次改完编译运行,效率好低,让我很绝望 ...
- SaltStack安装配置详解
一.简介 Saltstack 比 Puppet 出来晚几年,是基于Python 开发的,也是基于 C/S 架构,服务端 master 和客户端 minions :Saltstack 和 Puppet ...
- leetcode — set-matrix-zeroes
import java.util.Arrays; /** * Source : https://oj.leetcode.com/problems/set-matrix-zeroes/ * * * Gi ...
- PHP中的加强型接口Traits
接口是对多重继承的一种变相实现, Traits可以被视为一种加强型的接口. 先来看如下代码 trait Hello { private $name = 'chenqionghe'; public ...
- 教你用Python创建瀑布图
介绍 对于绘制某些类型的数据来说,瀑布图是一种十分有用的工具.不足为奇的是,我们可以使用Pandas和matplotlib创建一个可重复的瀑布图. 在往下进行之前,我想先告诉大家我指代的是哪种类型的图 ...