0

Python 2.7x に既存のサンプル クラスがあります。

class Example(object):
    a = None
    b = None
    c = None

および既存のインスタンス

anInstance = Example()
anInstance.a = 100
anInstance.b = 200
anInstance.c = 300

私はいくつかのコードをリファクタリング/クリーンアップしてきましたが、これanInstance.cはめったに使用されない高価な操作であることがわかっています。

完璧な世界では、私はこれを行うだけです:

class Example(object):
    _c = None
    @property
    def c(self):
        if self._c is not None:
           self._c = DO EXPENSIVE STUFF HERE
        return self._c

問題は、今すぐ変更できないことclass Exampleです。[したがって、クイックフィックスは、それを関数として設定し、すべてobj.cを に変更することobj.c()です]

私が知る限り、オブジェクトを変更しない限り、プロパティ/メモ化を動的に割り当てる方法はありません。その理解は正しいですか?私はここでがっかりすることを期待しています。確認が欲しいだけです。

4

1 に答える 1

4

事後にpythonクラスを変更できます:

@property
def c(self):
    if self._c is None:
        self._c = DO EXPENSIVE STUFF HERE
    return self._c

Example.c = c
Example._c = None

cクラスにプロパティを追加し、_c属性を追加しました。

もちろん、 に代入できると想定しているクラスの既存のメソッドをオーバーライドする必要がある場合がありますself.c

オブジェクトの属性を動的に追加または置換するプロセスは、多くの場合、モンキー パッチと呼ばれます。

于 2013-06-21T22:27:20.033 に答える