python里with...as语句的执行过程,__exit__(self, type, value, trace)的几个参数含义

形如下文的代码。

with Sample() as ha:        #Sample是类名
    print("sample:", ha )

一般来说类中会实现以下两个方法。

def __enter__(self):

def __exit__(self, type, value, trace):

如:

class Sample:
    def __init__(self):
        print("In __init__()")

    def __enter__(self):
          print("In __enter__()" )
          return "Foo"

    def __exit__(self, type, value, trace):
           print("In __exit__()")

    def get_sample():
         return Sample()

with Sample() as ha:
     print("sample:", ha )
     print('执行a=1/0之前')
     a = 1 / 0
     print('执行a=1/0之后')

其执行过程为:

  • 类的__init__()方法执行
  • 类的__enter__() 方法被执行
  • ha被赋值:__enter__() 方法返回的值(这个例子中是”Foo”)被赋值给变量ha
  • 执行执行with-block中的语句,即执行print("sample:", ha )等语句
  • 类的__exit__() 方法被调用(如with-block中的语句遇到错误,则会立即调用exit()方法,然后报错)

(若with-block中的语句出现错误,如a=1/0,则会忽略with-block中a=1/0之后的语句,立即调用__exit__() 方法,然后报告错误,)

输出如下:

In __init__()
In __enter__()
sample: Foo
执行a=1/0之前
In __exit__()
Traceback (most recent call last):
  File "F:\PythonCode\venv\Main.py", line 17, in <module>
    a = 1 / 0
ZeroDivisionError: division by zero

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值