用到了两个系统内置函数__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运行完毕,则代表代码块已经完成执行