为什么@contextmanager仅用于自包含函数?

时间:2018-02-11 06:16:58

标签: python contextmanager

我正在阅读 Python Cookbook ,其中提到了以下内容:

  

@contextmanager实际上只用于编写自包含   上下文管理功能。如果你有一些对象(例如文件,   需要支持with的网络连接或锁定   声明,您仍然需要实施__enter__exit__   方法分开。

我无法理解这一点。为什么我们不能使用具有上下文管理功能的文件对象? Aren的函数用@contextmanager装饰,等同于__enter____exit__方法的类?

1 个答案:

答案 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__