Try-finally 装饰器清理 python 对象

Pau*_*eeb 5 python class decorator resource-cleanup python-2.7

似乎对象清理是我在编程期间遇到的一个非常常见的问题。迄今为止,我一直with按照此处的建议使用该语句

我今天有另一个想法,对我来说似乎更优雅(因为它不需要最终用户的 with 语句)。这个想法是对某种类型的对象使用 try-finally 装饰器(有一个清理方法)。

只是想知道这种做法是否有问题,或者是否有更好的方法。我不喜欢我的许多类需要使用 with 语句进行初始化,但我也想确保我的对象正确关闭。这是一个简短的例子。

def cleanme(func):
    def _decorator(self, *args, **kwargs):
        try:
            func(self, *args, **kwargs)
        finally:
            self._cleanup()

    return _decorator


class IObject(object):
    def __init__(self):
        self.file_name = "some_file.txt"
        self._file_object = None
        self._cleaned = True

    @cleanme
    def run(self):
        self._connect()
        while True:
            # do some things over a long period
            pass

    def _connect(self):
        self._file_object = open(self.file_name)
        self._cleaned = False

    def _cleanup(self):
        if not self._cleaned:
            self._file_object.close()
            self._cleaned = True
Run Code Online (Sandbox Code Playgroud)

Vic*_*nko 3

让我在这上面打几个洞。

一种想法是,你强迫你的类有一个cleanup(),它的声明不是在与 不同的地方run()。因此,您要求用户有责任干净地实施和维护它。

除此以外的析构函数__exit__在 Python 中相当罕见,因此资源获取代码可能会偏离cleanup()代码,从而造成泄漏。

其次,您要创建file_object一个实例变量,从而扩大其范围从单个函数,这也有点不好。