#with语句(上下文管理器)
#with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件的正确关闭,
#以此来达到释放资源的目的
'''
with open(上下文管理器)
'''
with open('a.txt','r') as file:#as起个别名
print(file.read())#不用写close了,不用手动关闭
'''
MyContentMgr实现了特殊方法__enter__()和__exit__()称该类对象(一切皆对象)
遵守了上下文管理器协议,
该类对象的实例对象就成为上下文管理器
MyContentMgr()#创建实例对象,写个小括号就表示创建该类的实例对象了
即当一个类涵盖两种方法enter和exit的时候,这个类的对象就称为上下文管理器
'''
'''
class MyContentMgr(object):
def __enter__(self):
print('enter方法被调用执行了')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit方法被调用执行了')
return self
def Show(self):
print('show方法被调用执行了')
#def Show(self):
#print('show方法被调用执行了',1/0)
with MyContentMgr() as file:#相当于file=MyContentMgr()
file.Show()
#自动调用enter方法
#with开始先调用enter,with结束时调用exit
#with下面有缩进,缩进里面的东西都成为with语句体
#当with语句体执行完毕后,会自动跳出上下文管理器,然后调用exit方法
#enter被执行-->执行with语句体-->执行exit
#无论程序是否出错,都会执行exit方法,自动关闭了资源
#
'''
with open('logo.jpg','rb') as src_file:#读取二进制文件
#相当于src_file=open('logo.jpg','rb')
with open('copy2logo.jpg','wb') as target_file:#写二进制文件,起名名为copy2logo.jpg
#相当于target_file=open('copy2logo.jpg','wb')
target_file.write(src_file.read())
#不用手动写关闭了