オブジェクトのクリーンアップは、プログラミング時代に遭遇した非常に一般的な問題のようです。今日まで、ここで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