我正在阅读 Python Cookbook ,其中提到了以下内容:
@contextmanager
实际上只用于编写自包含 上下文管理功能。如果你有一些对象(例如文件, 需要支持with
的网络连接或锁定 声明,您仍然需要实施__enter
和__exit__
方法分开。
我无法理解这一点。为什么我们不能使用具有上下文管理功能的文件对象? Aren的函数用@contextmanager
装饰,等同于__enter__
和__exit__
方法的类?
答案 0 :(得分:2)
说你上课了:
class DatabaseCursor(object):
...
并且您想要向其添加上下文管理器功能。你会把@contextmanager
放在哪里?
不在这里:
@contextmanager
class DatabaseCursor(object):
...
不在这里:
class DatabaseCursor(object):
@contextmanager
def __init__(self, ...):
...
不在这里:
class DatabaseCursor(object):
@contextmanager
def __enter__(self):
...
无处,真的。 @contextmanager
无法帮助您向现有类添加上下文管理器功能。你甚至不能使用@contextmanager
- 修饰函数作为基类,因为实现并没有实际创建一个类。如果您希望类文件对象或数据库游标或网络连接或其他可关闭资源支持用作上下文管理器,则必须直接实现__enter__
和__exit__
。