2017-02-23 8 views
-2

値を一度計算しようとしています(時間がかかるため)、再度使用できるように値を保存しています。
私はtypes.MethodTypeを認識していますが、プロパティを参照するだけで、呼び出す必要はありません。@propertyメソッドのPythonをオブジェクトに再割り当て

import types 

class stuff: 
    @property 
    def compute_once(self): 
    takes_long_time_to_calculate = 5 - 2 
    self.compute_once = takes_long_time_to_calculate 
    return takes_long_time_to_calculate 

instance = stuff() 

print(instance.compute_once) 
print(instance.compute_once) 

エラーメッセージ:

Traceback (most recent call last): 
    File "try.py", line 12, in <module> 
    print(instance.compute_once) 
    File "try.py", line 7, in compute_once 
    self.compute_once = takes_long_time_to_calculate 
AttributeError: can't set attribute 
+0

これはかなりですが、idk –

答えて

2

あなただけの別の属性では、高価な計算の結果を格納する必要があります。 1つの先頭にアンダースコアを付けて名前を付けることで、プライベートとしてマークすることができます。それは単なる大会ですが、Pythonはそのような属性に特別なことは何もしませんが、コードのユーザはそれらに直接干渉してはならないことを知っています。 Pythonは本当に私的な属性を持っていません。代わりに、 "私たちは皆ここで大人に同意しています"という哲学を持っています。私たちは、None._compute_onceを初期化し、._compute_onceNoneある場合にのみ、高価な計算を実行し、出力

Doing expensive calculation 
210 
210 

https://stackoverflow.com/a/70736/4014959

class Stuff: 
    def __init__(self): 
     self._compute_once = None 

    @property 
    def compute_once(self): 
     if self._compute_once is None: 
      print('Doing expensive calculation') 
      self._compute_once = 2 * 3 * 5 * 7 
     return self._compute_once 

instance = Stuff() 

print(instance.compute_once) 
print(instance.compute_once) 

を参照してください。 ._compute_onceNoneにリセットすることで、いつでも再計算を強制することができます。

プロパティの動作の詳細については、Descriptor HowTo GuideをPythonのコア開発者(およびSOのベテラン)Raymond Hettingerによってお読みください。

関連する問題