面试题答案
一键面试Python上下文管理器工作原理
上下文管理器通过 __enter__
和 __exit__
这两个特殊方法来实现其功能。当使用 with
语句进入上下文时,会调用上下文管理器对象的 __enter__
方法,该方法返回的值会绑定到 with
语句中的目标变量(如果有)。当离开 with
代码块时,无论是否发生异常,都会调用上下文管理器对象的 __exit__
方法。如果发生异常,__exit__
方法的参数会包含异常类型、异常值和追溯信息,通过适当处理这些参数,可以决定是否抑制异常。
自定义文件操作上下文管理器类
class FileContextManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
try:
self.file = open(self.filename, self.mode)
print('文件打开')
return self.file
except Exception as e:
print(f'打开文件时发生错误: {e}')
return None
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
print('文件关闭')
if exc_type:
print(f'发生异常: {exc_type}, {exc_value}, {traceback}')
# 如果希望抑制异常,返回True
# return True
使用示例:
with FileContextManager('test.txt', 'w') as f:
if f:
f.write('Hello, World!')