通常のlazy propertyデコレータのようなものを使用したいと思いますが、TensorFlowの仕組みと使用方法によって、遅延プロパティはすべて__init__
最新(TensorFlowの部分は質問の一部ではありませんが、私が意味するものについてはhereを参照してください)。 「初期化する」とは、getattr
を呼び出してプロパティメソッドを一度実行し、結果をキャッシュすることだけです。__init__で自動的に初期化される "レイジー"プロパティ
次作品すでに:
import functools
def graph_property(getter):
property_name = getter.__name__
attribute = '_cache_' + property_name
@property
@functools.wraps(getter)
def decorated(self):
if not hasattr(self, attribute):
setattr(self, attribute, getter(self))
self._graph.append(property_name) # for illustration
print('Initializing ' + property_name)
return getattr(self, attribute)
return decorated
class Test:
def __init__(self):
self._graph = []
self.inputs # DON'T LIKE TO DO THIS
self.do_stuff # AND THIS
@graph_property
def inputs(self):
return 42.0
@graph_property
def do_stuff(self):
return self.inputs + 1.0
if __name__ == '__main__':
t = Test()
print(t._graph)
しかし、__init__
にself.input
とself.do_stuff
への手動呼び出しを取り除くためにいいだろう - すぐに退屈されることを。
私は、プロパティがgraph_property
であることを「覚えている」という複数の方法について考えていましたが、デコレータが適用されているのでクラスはまだ分かっていないので、ただ、self
)。
戻ってdecorated
オブジェクトにタグ属性を与えて、Test
のメタクラスを作成して、すべてのメソッドを調べ、このタグを持つメソッドを収集し、何らかの方法でそれらのイニシャライザを作成します。私はメタクラスに慣れていないし、property
の記述子では属性を追加できないため、これを実装できませんでした。
説明されたアプローチが実行可能かどうか(もしそうであれば)?または、手動のオーバーヘッドなしで、同様に素敵な構文で、より簡単な方法がありますが、私はそれを見ていませんか?
ああ、このサブクラスのトリックは美しいです!私は共通基底クラスを持っていますので、これは完全に適合します。 – phg
'vars(type(self))。items()'はスーパークラスで定義された変数を含んでいません。これは先祖クラスではなく宣言されたクラス自体の記述子をチェックするだけです。 – jsbueno
@jsbueno属性を取得するために、[再帰的に行く] 'dir()'を使用するように更新されました(http://stackoverflow.com/a/33089239/846892)。 –