如何在Python中检查对象的字段是否已更改?

时间:2017-05-10 16:43:54

标签: python hash

我有这样的课程:

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

我通过以下方式创建此类的实例:

p1 = Point(5, 10)

我想知道这个类的任何字段是否已更改。我想可以有某种哈希函数,我可以比较它。

例如,在bash中我可以写md5sum <<<"string"md5sum <<<"string"以分别获得xy。然后我可以比较xy,看看它们是否不同。

是否有类似的方法适用于Python的对象?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

该技术使用: