gpt4 book ai didi

python - Try-finally 装饰器清理 python 对象

转载 作者:行者123 更新时间:2023-11-28 22:48:38 25 4
gpt4 key购买 nike

对象清理似乎是我在编程期间遇到的一个很常见的问题。迄今为止,我一直按照推荐的方式使用 with 语句 here

我今天有另一个想法,对我来说似乎更优雅(因为它不需要最终用户的 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

最佳答案

让我在这上面打几个洞。

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

__exit__ 之外的析构函数在 Python 中很少见,因此资源获取代码可能会偏离 cleanup() 代码,造成泄漏。

其次,您正在使 file_object 成为一个实例变量,从而扩大了它的范围,使其不再是单个函数,这也有些不好。

关于python - Try-finally 装饰器清理 python 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com