2017-05-10 4 views
0

は、私はこのようなクラスを持っている:Pythonでオブジェクトのフィールドが変更されているかどうかをチェックする方法は?

p1 = Point(5, 10) 

私はこのクラスの任意のフィールドが変更されたかどうかを知りたい:

class Point(object): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

は、私はこのクラスのインスタンスを作成します。私は、私が比較することができる何らかの種類のハッシュ関数があるかもしれないと思います。

例えば、,yを得るために、私はmd5sum <<<"string"md5sum <<<"string"と書くことができます。次に、xyを比較して、それらが異なっているかどうかを調べることができます。

Pythonのオブジェクトで動作する類似の方法はありますか?

答えて

2

__setattr__クラスメソッドをオーバーライドするだけで簡単に達成できます。

In[6]: class Point(object): 
      def __init__(self, x, y): 
       self.x = x 
       self.y = y 
       self._changed = False 

      def __setattr__(self, key, value): 
       if key != '_changed': 
        self._changed = True 
       super(Point, self).__setattr__(key, value) 

      def is_changed(self): 
       return self._changed 

In[7]: p = Point(2,3) 
In[8]: p.is_changed() 
Out[8]: False 
In[9]: p.x = 23 
In[10]: p.is_changed() 
Out[10]: True 
0

はい、変化を検出するために、すべてのインスタンス変数をハッシュする方法があります:

>>> p1 = Point(5, 10) 
>>> h = hash(frozenset(vars(p1).items()))  # Record a hash checksum 
>>> h == hash(frozenset(vars(p1).items()))  # Check for changes 
True 
>>> p1.x += 1         # Change the object data 
>>> h == hash(frozenset(vars(p1).items()))  # Check for changes 
False 

技術を使用しています:

  • vars()は、インスタンス辞書にアクセスするためには、
  • items()タプルのリストとしてキーと値を取得する
  • frozenset()
  • hash()
  • はチェックサムを計算するために順不同ハッシュ可能を作るために
関連する問題