5

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

2 に答える 2

3

これにいくつかの穴を撃ちましょう。

ある考えでは、クラスに を持たせることを義務付けています。cleanup()これは、 とは異なる場所では宣言されていませんrun()。したがって、それをきれいに実装して維持する責任をユーザーに課しています。

以外のデストラクタ__exit__は Python ではあまり一般的ではないため、リソース取得コードがcleanup()コードから逸脱し、リークが発生する可能性があります。

第 2 に、インスタンス変数を作成してfile_objectいるため、単一の関数からその範囲を広げていますが、これもやや悪いことです。

于 2014-07-22T15:21:45.850 に答える