Python __exit__,__enter__函数with语句的组合应用

简介: Python __exit__,__enter__函数with语句的组合应用

__exit____enter__函数with语句的组合应用

 


简介

设计对象类时,我们可以为对象类新增两个方法,一个是__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。另外,如果该函数返回True1类值的Boolean真值,那么将忽略“代码块”中的异常,停止执行“代码块”中剩余语句,但是会继续执行“代码块”后面的语句;如果函数返回类似0False类的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

 

运行结果如下,

 

 

 

 

目录
相关文章
|
19天前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
74 0
|
9天前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
197 101
|
16天前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
164 99
|
16天前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
144 98
|
20天前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
2月前
|
数据采集 监控 Java
Python 函数式编程的执行效率:实际应用中的权衡
Python 函数式编程的执行效率:实际应用中的权衡
207 102
|
20天前
|
机器学习/深度学习 算法 安全
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
|
2月前
|
Python
Python 函数定义
Python 函数定义
119 1
|
28天前
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
137 0
|
1月前
|
设计模式 缓存 运维
Python装饰器实战场景解析:从原理到应用的10个经典案例
Python装饰器是函数式编程的精华,通过10个实战场景,从日志记录、权限验证到插件系统,全面解析其应用。掌握装饰器,让代码更优雅、灵活,提升开发效率。
94 0

推荐镜像

更多