python exit函数_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'

classUser(object):

def__init__(self, username, password):

self._username =username

self._password = password

@property

defusername(self):

returnself._username

@username.setter

defusername(self, username):

self._username = username

@property

defpassword(self):

returnself._password

@password.setter

defpassword(self, password):

self._password = password

def__enter__(self):

print('auto do something before statements body of with executed')

returnself

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)

withUser('shouke','2014')asuser:

print(user.password)

print('---------end-----------')

运行结果

1569452-20181231235321688-1693529092.png

sg_trans.gif

如上,代码块运行前调用了__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)

returnFalse

if__name__ =='__main__':

boy = User('shouke','shouke2014')

print(boy.password)

withUser('shouke','2014')asuser:

print(user.password)

12/0

print('after execption')

print('---------end-----------')

运行结果

1569452-20181231235331267-1593744269.png

sg_trans.gif

对比实验:

在上述的基础上继续修改代码

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)

returnTrue

if__name__ =='__main__':

boy = User('shouke','shouke2014')

print(boy.password)

withUser('shouke','2014')asuser:

print(user.password)

12/0

print('after execption')

print('---------end-----------')

运行结果:

1569452-20181231235342406-747025682.png

sg_trans.gif

注意:

1、抛异常后,代码块中剩余的语句没有再继续运行

2、如果在上述的基础上,把代码中的12/0剪切后放到password(self)中,抛出异常的异常信息是不会传递给__exit__函数的

@property

defpassword(self):

12/0

returnself._password

运行结果如下,

sg_trans.gif

1569452-20181231235350513-183109862.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值