您的位置:首页 > 编程语言 > Python开发

Python概念-上下文管理协议中的__enter__和__exit__

2017-07-17 13:52 573 查看
所谓上下文管理协议,就是咱们打开文件时常用的一种方法:with

__enter__(self):当with开始运行的时候触发此方法的运行

__exit__(self, exc_type, exc_val, exc_tb):当with运行结束之后触发此方法的运行

exc_type如果抛出异常,这里获取异常的类型 

exc_val如果抛出异常,这里显示异常内容

exc_tb如果抛出异常,这里显示所在位置

代码示例:(以自己定义的Open类型做示例)

1 # 编辑者:闫龙
2 class Open:
3     def __init__(self,filename,mode,encoding): #在实例化Open的时候传入文件名称,打开方式,编码格式
4         self.filename = filename
5         self.mode = mode
6         self.encoding = encoding
7         #使用系统函数open()传入相应打开文件所需的参数,将文件句柄传递给self.file
8         self.file = open(filename,mode=mode,encoding=encoding)#这里我总感觉是在作弊
9     def read(self):#自己定义read方法
10         return self.file.read()#返回self.file文件句柄read()的值
11     def write(self,Context):#自己定义write方法
12         self.file.write(Context+"\n")#使用self.file文件句柄write方法将内容写入文件
13         print(Context,"已写入文件",self.filename)
14     # 利用__getattr__(),Attr系列中的getattr,当对象没有找到Open中传递过来的名字时,调用此方法
15     def __getattr__(self, item):
16         return getattr(self.file,item)#返回self.file文件句柄中,被对象调用,切在Open类中没有的名字
17     def __enter__(self):
18         return self
19     def __exit__(self, exc_type, exc_val, exc_tb):
20         self.file.close()
21         print("文件已经关闭")
22
23 # MyFile = Open("a.txt","w+","utf8")
24 # MyFile.write("Egon is SomeBody")
25 # MyFile.close()
26 # MyFile = Open("a.txt","r+","utf8")
27 # print(MyFile.read())
28 # MyFile.seek(0)
29 # print(MyFile.readline())
30 # MyFile.close()
31
32 with Open("a.txt","r+","utf8")  as  egon:
33     print(egon.read())


__enter(self)__

 负责返回一个值,该返回值将赋值给as子句后面的var_name,通常返回对象自己,即“self”。函数优先于with后面的“代码块”(statements1,statements2,……)被执行。

  __exit__(self, exc_type, exc_val, exc_tb)

执行完with后面的代码块后自动调用该函数。with语句后面的“代码块”中有异常(不包括因调用某函数,由被调用函数内部抛出的异常),会把异常类型,异常值,异常跟踪信息分别赋值给函数参数exc_type,exc_val,
exc_tb,没有异常的情况下,exc_type,exc_val, exc_tb值都为None。另外,如果该函数返回True、1类值的Boolean真值,那么将忽略“代码块”中的异常,停止执行“代码块”中剩余语句,但是会继续执行“代码块”后面的语句;如果函数返回类似0,False类的Boolean假值、或者没返回值,将抛出“代码块”中的异常,那么在没有捕获异常的情况下,中断“代码块”及“代码块”之后语句的执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: