最初にアクセスしたときに関数を実行して値を返し、次にが(この型の変更など)という属性のattr
のクラスを持っています。同様の現象がで得ることができるクラスプロパティを置き換える/バイパスする方法は?
:
class MyClass(object):
@property
def attr(self):
try:
return self._cached_result
except AttributeError:
result = ...
self._cached_result = result
return result
obj = MyClass()
print obj.attr # First calculation
print obj.attr # Cached result is used
これを行うときしかし、.attr
はは、初期結果になっていません。そうした方が効率的です。
obj.attr
がプロパティに設定された後、無限ループが自然に表示されるため、他のものに簡単に設定することはできません。したがって、上のコードでは、obj.attr
プロパティはセッターを持たないため、直接変更することはできません。セッターが定義されている場合、このセッターのobj.attr
を置き換えると、無限ループが作成されます(セッターはセッター内からアクセスされます)。私はまた、最初のdel self.attr
と普通のことができるようにセッターを削除することを考えましたが、これはプロパティの削除者(もしあれば)を呼び出し、無限ループの問題を再現します(self.attr
の変更は、プロパティルールを介して)。
したがって、プロパティのメカニズムをバイパスし、バインドされたプロパティobj.attr
を何かで置き換える方法がありますか?MyClass.attr.__getter__
?
私はちょうど同じことを書いていましたが、私はあなたの代わりにあなたをアップボートします。これは完璧に機能します! – Saksow
ありがとうございます。私は、 "あなたのプロパティから記述子を変更するには、あなたのクラスを編集しなければならない"という部分を理解しているのか分かりません:実際には、必要なのはクラス自体の更新ではありません( '新しいインスタンスに対しては「attr」)、_instance_の 'attr'属性の更新です。右? – EOL
いいえ、 'attr'が両方**クラス**と**データ記述子**で定義されている限り、代わりに使用されるためです。 Pythonの属性検索の順序はちょっと難しいかもしれませんが、[ここではもう少し詳しく読んでいます](https://utcc.utoronto.ca/~cks/space/blog/python/AttributeLookupOrder)。 – pistache