2017-10-03 17 views
-1

最近、セロリやdjango(Djangoのユーティリティ機能)やボトルWebフレームワークなどのPythonサードパーティ製パッケージのコードベースの一部にデコレータcached_propertiesが使用されています。 cached_propertiesを使用するためのスタンドアロンパッケージもあります。 私が理解している限り、キャッシングの動作を提供することによって、計算量が増えないようにすることです。cached_propertyコンストラクトを使用したPythonのキャッシュプロパティ

class cached_property(object): 
    """ 
    A property that is only computed once per instance and then replaces itself 
    with an ordinary attribute. Deleting the attribute resets the property.""" 

    def __init__(self, func): 
     self.__doc__ = getattr(func, '__doc__') 
     self.func = func 

    def __get__(self, obj, cls): 
     if obj is None: 
      return self 
     value = obj.__dict__[self.func.__name__] = self.func(obj) 
     return value 

、これは、それが使用されている方法である:我々はそれを実行したときに

class Monopoly(object): 

    def __init__(self): 
     self.boardwalk_price = 500 

    @cached_property 
    def boardwalk(self): 
     # Again, this is a silly example. Don't worry about it, this is 
     # just an example for clarity. 
     self.boardwalk_price += 50 
     return self.boardwalk_price 

今の価格は$ 550のままここで

はそれがcached_propertyを実装して取り除かソースコードです。

>>> monopoly = Monopoly() 
>>> monopoly.boardwalk 
550 
>>> monopoly.boardwalk 
550 
>>> monopoly.boardwalk 
550 

は、我々は単に属性/プロパティへの最初の呼び出しの結果を保存して再計算を避けるために、後でそれを使用することはできませんか?私はこれが非常にばかげた質問だと確信していますが、私はここで何が欠けていますか?

例:あなたができる

monopoly = Monopoly() 
>>> stored_value = monopoly.boardwalk 
550 

# now use stored_value instead of making a call to `monopoly.boardwalk`. 
+0

@MartijnPietersありがとう、私はそれを持っています:)しかし、理由はありません質問downvotedですか?ここで質問しているうちに何かが欠けていますか? – anekix

+0

申し訳ありませんが、私は心を読むことができません。投票は理由のために匿名です。私たちができることは、downvoteボタンのツールチップを指しています:*この質問は研究努力を示していません。それは不明または役に立たない*。投票者はあなたが問題を調査した質問に何の示唆もないと感じたかもしれません。再び、私は心を読んだり、投票した人を見ることさえできません。 –

答えて

1

確かに、しかし、何さまざまな場所monopoly.boardwalkを使用がある場合は?これで、すべての場所が値をローカルにキャッシュするようにする必要があります。 またはを使用すると、Monopolyクラスのキャッシュを担当させることができます。

cached_property属性のコンシューマではなく、そのクラスを簡単にすることができます。

さまざまな場所で使用されているものの例を見つけるのに苦労している場合:適切なサイズのDjangoアプリケーションでは、テンプレート、ビュー、バックエンドコードがすべて特定のモデルに接触する可能性があります。これらの場所のいくつかはDjangoフレームワーク自体(管理インターフェースのようなもの)にあり、高価な操作をモデルに追加するときにこれらの場所をすべて更新することは現実的ではありません。デコレータの使用です。モデルに責任を持たせることで、他のすべてのコードをよりシンプルに保ちます。

関連する問題