我正在尝试创建一个在集合操作中行为正常的自定义对象。集合操作中对象的行为
我已经普遍认识到它的工作原理,但是我想确保我完全理解它的含义。特别是,当对象中有其他数据未包含在equal/hash方法中时,我对这种行为感兴趣。看起来,在“交集”操作中,它返回被比较的对象集合,其中'联合'操作返回被比较的对象集合。
举例说明:
class MyObject:
def __init__(self,value,meta):
self.value = value
self.meta = meta
def __eq__(self,other):
return self.value == other.value
def __hash__(self):
return hash(self.value)
a = MyObject('1','left')
b = MyObject('1','right')
c = MyObject('2','left')
d = MyObject('2','right')
e = MyObject('3','left')
print a == b # True
print a == C# False
for i in set([a,c,e]).intersection(set([b,d])):
print "%s %s" % (i.value,i.meta)
#returns:
#1 right
#2 right
for i in set([a,c,e]).union(set([b,d])):
print "%s %s" % (i.value,i.meta)
#returns:
#1 left
#3 left
#2 left
这种行为的地方,并确定记录?如果是这样,那么治理原则是什么?
望着文档的__hash__方法,它不会出现,表明不可能有未散列对象中的数据。我可以想到许多例子,其中两个相同的对象将具有不同的某种形式的元数据(可能是时间戳或文件名)。 从__hash__的文档:唯一需要的属性是比较相等的对象具有相同的散列值;建议以某种方式混合在一起(例如,使用排他或散列值)用于对象的组成部分,这些组成部分也是对象比较的一部分。 – 2010-04-07 19:10:33
我对你的评论感到困惑,你似乎同意我的看法。如果一个对象具有被eq和hash忽略的元数据(例如时间戳或文件名),那么它们不够重要,不能被保存,要么被比较的对象会做。如果它们足够重要以区分这两个对象,它们将被包含在散列和等式中。你现在在问什么? – hlfrk414 2010-04-07 19:22:33
我并不赞同你;)。试图了解如何使用这些功能。在这种情况下,我有一个由监视代理创建的对象。尝试关联具有不同时间戳的重复性警报条件。宁愿保留旧的对象,但当然我可以用其他方式实现它,因为我怀疑你是正确的。 – 2010-04-07 19:46:40