本节将继续讲解剩下的几个比较重要的特殊函数重写~
一. 实现环境管理器
- 异常相关的语句
- try-except 捕获异常,将异常转为正常执行;
- try-finally 不改变异常状态;
- raise 触发异常,发出错误通知;
- assert 根据条件触发'AssertError'
- with 语句:
- 语法:with 表达式1 [as 变量1], 表达式2 [as 变量2], ...:
- 作用:用于对资源进行访问的场合,确保使用过程中不管是否发生异常,都会执行必须的'清理'操作,并释放资源。如文件使用后自动关闭,线程中锁的自动获取和释放等;
- 说明:
- 用as子句中的变量绑定生成的对象;
- with语句并不改变异常的状态;
- 使用 with 语句进行管理的对象必须是环境管理器(即必须包含__enter__方法和__exit__方法);
"""文件复制"""
src_file = input('请输入原文件:')
dst_file = input('请输入目标文件:')
try:
with open(src_file, 'rb') as src, \
open(dst_file, 'wb') as dst:
while True:
b = src.read(4096)
if not b:
break
dst.write(b)
except OSError:
print('复制失败!')
运行结果:
- 环境管理器(也称为上下文管理器):
- 类内有__enter__方法和__exit__实例方法的类被称为环境管理器;
- 能够用with语句进行管理的对象必须是环境管理器;
- __enter__将在进入with语句时被调用,并返回由as变量绑定的对象;
- __exit__将在离开with语句时被调用,且可以用参数来判断在离开with语句时是否有异常发生并做出相应处理
示例:
"""环境管理器类的定义和使用"""
class A:
"""此类的对象可以用with语句进行管理"""
def __enter__(self):
"""__enter__将在进入with语句时被调用,并返回由as变量绑定的对象"""
print('进入with语句...')
return self
def __exit__(self, exc_type, exc_value, exc_tb):
""""__exit__将在离开with语句时被调用,且可以用参数来判断在离开with语句时是否有异常发生并做出相应处理"""
print('离开了with语句...')
if exc_type is None:
print('正常离开with,没有发生异常')
else:
print('离开with语句时发生异常')
print("异常类型:", exc_type)
print('错误的值是', exc_value)
if __name__ == "__main__":
try:
with A() as a:
print('这里是with语句内部...')
print(3 / 0) # 即便with语句内出现异常,也会自动调用__exit__方法
except ZeroDivisionError:
print('except已捕获异常,并将程序转为正常状态!')
print('程序退出!')
运行结果: