Python的方法就像Java中的'equals'

时间:2015-08-10 23:16:04

标签: python equals

如何让set让对象相等依赖于我设置的自定义属性?就像Java的equals方法一样。

关键是我想要一个包含元组(x,y)的集合。当我尝试将(x,y)元组放入集合中时,结果将取决于x

set.add((x,y))
- OK 
set.add((x,z))
- Can't add because there is already a touple which has x as a first value. 

1 个答案:

答案 0 :(得分:2)

为什么不使用dict而不是set tuple s:

d = {}
d[x] = y
d[x] = z

虽然会使用y覆盖z值,但它确保您一次只有一个值。

如果您不希望覆盖成为可能,可以将dict子类化为阻止它:

class HalfFrozenDict(dict):  # Name is a subject to change

    def __setitem__(self, key, value):
        if key in self:
            raise KeyError("Key '{}' already exists!".format(key))
        super().__setitem__(key, value)

    def update(self, other):
        other = {key: other[key] for key in other if key not in self}
        super().update(other)

目前,如果您尝试重新设置项目,则会引发错误:

>>> d = HalfFrozenDict()
>>> d[0] = 1
>>> d[0] = 2
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    d[0] = 2
  File "<pyshell#1>", line 5, in __setitem__
    raise KeyError("Key: '{}' already exists!".format(key))
KeyError: "Key '0' already exists!"

此外,调用d.update(other)只会忽略other字典中的重复键。

这两种行为都有可能发生变化:你宁愿在&#34;无效&#34; update()打电话?您是否愿意忽略重新设置项目(我认为在这种情况下错误更好)?