-2
プロパティにアクセスするたびにではなく、オブジェクトの初期化時にプロパティ値を1回計算するプロパティデコレータを作成したいとします。たとえば:メソッドデコレータ内から__init__にコードをパッチすることは可能でしょうか?
class Foo:
def __init__(self, value):
self.value = value
@cached_property # How to implement this decorator?
def foo(self):
return self.value * some_heavy_computation()
私はこれはと同等と希望:
class Foo:
def __init__(self, value):
self.value = value
self._foo = self.value * some_heavy_computation()
@property
def foo(self):
return self._foo
それは何とか方法デコレータ内から__init__()
にコードを追加することは可能ですか?
を、クラス自体はしていません既に定義済みであっても、それを修正するための '' __init__''メソッドを調べる方法はありません(これはあなたが期待できるものではありません)。ただし、初めてラップされた関数を呼び出すデコレータを記述し、その値をインスタンス変数に保存してから、キャッシュされた値を返すだけでも可能です。 – jasonharper
なぜあなたは '__init__'にコードを追加する必要があると思いますか? [ディスクリプタプロトコル](https://docs.python.org/3/howto/descriptor.html)でお読みください。 – jonrsharpe
@jasonharper同じ 'cls'の' __init__'を手に入れて、 '__init__'をパッチしたものに置き換えることができませんでしたか? '__init__'が他のメソッドの前に常に定義されていると仮定しています。 – danijar