Python学习之旅---上下文管理协议

Posted 陈帅帅_大侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习之旅---上下文管理协议相关的知识,希望对你有一定的参考价值。

# with obj as  f:
# ‘代码块‘
#
# 1.
# with obj - ---》触发obj.__enter__(), 拿到返回值
#
# 2.as f - ---->f = 返回值、
#
# 3.
# with obj as f 等同于 f=obj.__enter__()
#
# 4.
# 执行代码块
# 一:没有异常的情况下,整个代码块运行完毕后去触发__exit__, 它的三个参数都为None
# 二:有异常的情况下,从异常出现的位置直接触发__exit__
# a:如果__exit__的返回值为True,代表吞掉了异常,后面的代码可以继续运行
# b:如果__exit__的返回值不为True,代表吐出了异常,后面的代码统统不执行
# c:__exit__的的运行完毕就代表了整个with语句的执行完毕


class Open:
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

with Open(‘a.txt‘) as f: #执行with open会触发__enter__,返回的self赋值给f
print(f)
print(frggggffgfg) #如果运行不存在的属性,直接触发__exit__运行,如果有返回True,异常直接被吞掉
print(f.name)
print(‘000000000000000000000000‘) #继续运行


#执行结果:

执行enter
<__main__.Open object at 0x0000016A045F7A58>
执行exit
<class ‘NameError‘>
name ‘frggggffgfg‘ is not defined
<traceback object at 0x0000016A04613388>
000000000000000000000000

以上是关于Python学习之旅---上下文管理协议的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅基本状态管理

Python学习之旅(三十四)

Python基础- 类和对象(使用继承派生组合接口多态封装propertystaticmethodclassmethod反射slots上下文管理协议元类)

python2.7高级编程 笔记一(Python中的with语句与上下文管理器学习总结)

Python学习日记简单了解迭代器生成器装饰器上下文管理器

8.python之上下文管理协议