上下文管理协议

__enter与__exit__

class Open:
    def __init__(self,name):
        self.name=name
    def __enter__(self):
        print('执行enter')
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('执行exit')

with Open('a.txt') as f:#with会调用__enter__函数
    print('------')
    print('******')     #当代码块执行完毕后会调用__exit__函数
#输出
#执行enter
#------
#******
#执行exit
无错误情况
class Foo:
    def __init__(self,name):
        self.name=name
    def __enter__(self):
        print('执行enter')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('执行exit')
        print(exc_type)
        print(exc_val)
        print(exc_tb)

with Foo('a.txt') as f:#调用__enter__,相当于f=obj.__enter__()
    print(f)
    print(f.name)
    print('------')
    print('******')
#当代码块没有错误时,执行完代码块后执行__exit__
print('这是最后一行')
#输出
'''
执行enter
<__main__.Foo object at 0x00000218E75F3EB8>
a.txt
------
******
执行exit
None
None
None
这是最后一行
'''
代码块里出现错误

class Foo:
    def __init__(self,name):
        self.name=name
    def __enter__(self):
        print('执行enter')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('执行exit')
        print(exc_type)#输出错误类型
        print(exc_val) #输出错误值
        print(exc_tb)  #输出错误追踪信息

with Foo('a.txt') as f:#调用__enter__,相当于f=obj.__enter__()
    print(f)
    print(f.name)
    print(a)             #这里出错会立即执行__exit__,打印出错误,程序会立即终止,下面的代码将不会执行
    print('------')
    print('******')
print('这是最后一行')
#输出
'''
执行enter
<__main__.Foo object at 0x00000202EDFB3EB8>
a.txt
执行exit
<class 'NameError'>
name 'a' is not defined
<traceback object at 0x00000202EDFBB748>
Traceback (most recent call last):
  File "E:/python3.6/three.py", line 16, in <module>
    print(a)
NameError: name 'a' is not defined
'''
出现错误让程序继续运行
class Foo:
    def __init__(self,name):
        self.name=name
    def __enter__(self):
        print('执行enter')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('执行exit')
        print(exc_type)#输出错误类型
        print(exc_val) #输出错误值
        print(exc_tb)  #输出错误追踪信息
        return True   #返回True让程序继续运行

with Foo('a.txt') as f:#调用__enter__,相当于f=obj.__enter__()
    print(f)
    print(f.name)
    print(a)             #这里出错会立即执行__exit__,打印出错误,代码块下的将不会执行,而是直接跳出代码块继续往下执行
    print('------')
    print('******')
print('这是最后一行')
#输出
''' 
执行enter
<__main__.Foo object at 0x000001C9211EA198>
a.txt
执行exit
<class 'NameError'>
name 'a' is not defined
<traceback object at 0x000001C9211EB748>
这是最后一行
'''






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值