Python';s方法,如';等于';在爪哇

Python';s方法,如';等于';在爪哇,python,equals,Python,Equals,如何使set使对象相等取决于我设置的自定义属性?就像Java的等于方法一样 关键是我想要一个包含元组的集合(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. 为什么不使用dict而不是tuple的set: d = {} d[x] = y d[x] = z 这

如何使
set
使对象相等取决于我设置的自定义属性?就像Java的
等于
方法一样

关键是我想要一个包含元组的集合
(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. 

为什么不使用
dict
而不是
tuple的
set

d = {}
d[x] = y
d[x] = z
这将用
z
覆盖值
y
,但它确保一次只有一个值

如果不希望重写成为可能,可以将
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=HalfFrozenDict()
>>>d[0]=1
>>>d[0]=2
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
d[0]=2
文件“”,第5行,在集合项中__
raise KeyError(“键:{}已存在!”。格式(键))
KeyError:“键“0”已存在!”
另外,调用
d.update(other)
将忽略
other
dict中的重复键


这两种行为都可能发生变化:您是否希望在“invalid”
update()
call上引发错误?您是否愿意忽略项的重新设置(我认为在这种情况下错误会更好)?

为什么不定义自定义类?尤其是因为您需要忽略。如果您想要大部分
set
class'功能,但想要更改一些方法,您可以执行
class myName(set):
然后定义您自己的函数
def add(self,item):…
请参阅。这看起来像一个dict,您只能写一次元素。