我怎样才能让类方法与python中的上下文管理器交互?

时间:2014-05-19 07:30:41

标签: python python-2.7

我的代码包含一些通过Pythons"使用"声明,以确保他们得到拯救关闭。

现在我想创建一个方法可以与这些对象交互的类。

例如,我的代码实际上是这样的:

with ... as a, with ... as b:
    # do something with a and b here
    call_method(a, b)  # pass a and b here

我想把它放到一个班级,所以看起来像#34;喜欢"这样:

class Something(object):

    def __init__(self):
        with ... as a:
            self.a = a
        with ... as b:
            self.b = b

    def do_something(self):
        # do something with self.a and self.b
        self.call_method(self.a, self.b)

    def call_method(self, a, b)
        # do more with a, b

物品需要保持打开状态"一直以来。

我不知道如何实现这一目标,所以我该怎么做?

2 个答案:

答案 0 :(得分:0)

您的班级中没有要管理的“上下文”,请勿在{{1​​}}中使用with。您必须以其他方式关闭文件。

如果您希望在方法中存在异常时关闭文件对象,则可以始终使用__init__try:

finally:

但是如果你真的希望它们在那时关闭的话,它在很大程度上取决于你想对这些文件做些什么。

如果您的实例本身应该在特定的上下文中使用(例如,有一段代码而不是开头和结尾,在此期间您的实例应该打开文件),那么您可以创建通过实施context manager special methods来完成上下文管理器。

作为类API的设计者,您将知道文件需要保留多长时间。这在很大程度上取决于关闭文件时实例的使用方式。

答案 1 :(得分:0)

你可以让你的班级本身成为一个上下文管理员:

class Something(object):

    def __init__(self):
        self.a = a
        self.b = b

    def __enter__(self):
        self.a_e = a.__enter__(self)
        self.b_e = b.__enter__(self)
    def __exit__(self, *x):
        xb = False
        try:
            xb = self.b_e(*x)
        finally:
            xa = self.a_e(*x)
        return xa or xb # make sure both are called.
    def do_something(self):
        # do something with self.a and self.b
        # - or, if present, with a_e, b_e
        self.call_method(self.a, self.b)
    def call_method(self, a, b)
        # do more with a, b

这只是一个原始想法。为了使其正常运行,您必须使用try: except: finally:执行更多操作。

您可以随后使用

with Something(x, y) as sth:
    sth.do_something()

它正确地__enter__()__exit__()编辑。