with上下文管理
class person:
def __init__(self,name):
self .name = name
def __enter__(self):
print('这是with定义的对象进到了enter方法中执行操作')
return self
def __exit__(self,exc_type,exc_value,exc_tb):
print('''with对象在enter中执行完毕之后会返回对象,
这是对象就会走到with方法中去执行当中的代码,在没有报错的情况下,执行完毕之后,
程序就会进入到exit方法中,然后完成关闭.这就是with方法不用手动关闭的原理.
''')
with person('小红') as p:
print(p.name)
总结:
- 程序在执行的时候
1.进到enter方法中执行,返回值为实例化的对象
2.返回对象之后,进入到with方法中去执行里面的代码
3.当没有异常发生的时候,顺利执行完成之后,对象就会进入到exit方法中去执行里面的代码
class person:
def __init__(self,name):
self .name = name
def __enter__(self):
print('这是with定义的对象进到了enter方法中执行操作')
return self
def __exit__(self,exc_type,exc_value,exc_tb):
print('''with对象在enter中执行完毕之后会返回对象,
这是对象就会走到with方法中去执行当中的代码,在没有报错的情况下,执行完毕之后,
程序就会进入到exit方法中,然后完成关闭.这就是with方法不用手动关闭的原理.
''')
with person('小红') as p:
print(p.name)
result = 1/0
print ('程序发生异常')
总结:
当程序在with代码块中执行遇到异常,那么异常下面的代码就不会被执行,程序就会立即跳转到exit方法中去执行.
class person:
def __init__(self,name):
self .name = name
def __enter__(self):
print('这是with定义的对象进到了enter方法中执行操作')
return self
def __exit__(self,exc_type,exc_value,exc_tb):
print('''with对象在enter中执行完毕之后会返回对象,
这是对象就会走到with方法中去执行当中的代码,在没有报错的情况下,执行完毕之后,
程序就会进入到exit方法中,然后完成关闭.这就是with方法不用手动关闭的原理.
''')
return True
with person('小红') as p:
print(p.name)
result = 1/0
print ('程序发生异常')
print('当exit方法返回值为True时,with里面的代码块异常下面的不再执行,但是在with语句外的下面的代码还是正常执行')
总结:
当exit方法执行返回的结果为true时,异常就会被隐藏掉了,所以后面的代码还是会被执行