Pythonオブジェクト内のデータフィールドに、あるイベント以降に変更があったことを伝えたいと思っています。私は、次のようなプロパティを使用して、この を実装するだろうと思った:Pythonオブジェクトのデータメンバーの要素へのアクセスをログに記録する
class C(object):
def get_scores(self):
print 'getter'
return self.__scores
def set_scores(self, value):
print 'setter'
self.__scores = value
self.__scoresWereChanged = True
scores = property(get_scores, set_scores, None, None)
def do_something(self):
if self.__scoresWereChanged:
self.__updateState() #will also set self.__scoresWereChanged to False
self.__do_the_job()
scores
は不変であるが、それはscores
がリストであると私はそれで単一の要素を変更、アプローチが失敗した場合に、このアプローチはうまく機能:
In [79]: c.scores = arange(10)
setter
In [80]: print c.scores
getter
Out[80]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [81]: c.scores[3] = 999
getter #setter was not called
私は、もちろん、これは私がしたいようellegantではありません、
In [84]: s = c.scores
getter
In [85]: s[3] = 2222
In [86]: c.scores = s
setter
によってこの問題を解決することができますが。
を記述子クラスを設定するにはクリーンになりますが、 '__getattribute__'はあなたを助けることができますか?オブジェクトのすべての属性へのアクセスを傍受する –