上下文管理协议

用到了两个系统内置函数__enter__ __exit__ 

如果想象打开文件那样来操作类的实例化对象,则必须在类里面写入上面两个方法,事实上通过with……as的方式实例化出来对象的值是通过__enter__的返回值来赋值的,enten在对象实例化的那一步会被触发,而exit则会在with里面的流程结束时触发 实现代码如下:

 1 class Sto:
 2     def __init__(self,name):
 3         self.name = name
 4 
 5 
 6     def __enter__(self):
 7         print('enter被执行')
 8         return self
 9 
10     def __exit__(self, exc_type, exc_val, exc_tb):
11         print('exit被执行了')
12 
13     def eat(self):
14         print('%s正在吃饭'%self.name)
15 
16     def sleep(self):
17         print('%s正在睡觉'%self.name)
18 
19 with Sto('小芬') as s1:
20    s1.sleep()
21 s1.eat()
22 print("***************************")
23 print("***************************")
24 print("***************************")

 执行代码块:

   在没有遇到异常的情况下,整个代码块执行完成之后,会触发exit,它的三个参数默认都为None

  一旦出现异常,异常位置直接触发exit

         如果将exit的返回值设置为True 则直接吞掉异常,继续向下执行

        若返回值不为True 则当场就报错了

        若exit运行完毕,则代表代码块已经完成执行

原文地址:https://www.cnblogs.com/wen-kang/p/9259101.html