让我们定义一个简单的类:
class sample(object):
def __init__(self, key):
self.key = key
假设a1,a2,a3,a4,a5是“sample”类的对象(a1和a5共享相同的“key”元素):
a1 = sample('test1')
a2 = sample('test2')
a3 = sample('test3')
a4 = sample('test4')
a5 = sample('test1')
现在,如果我将这些元素添加到列表中,那将是结果:
[<__main__.sample at 0x1189c1e90>,
<__main__.sample at 0x1189c1b90>,
<__main__.sample at 0x1189c15d0>,
<__main__.sample at 0x1189c1dd0>,
<__main__.sample at 0x1189c16d0>]
但如果我将此列表转换为“set”对象(删除a1 / a5),结果将为:
{<__main__.sample at 0x1189c15d0>,
<__main__.sample at 0x1189c16d0>,
<__main__.sample at 0x1189c1b90>,
<__main__.sample at 0x1189c1dd0>,
<__main__.sample at 0x1189c1e90>}
所以,问题是:如何修改类,以便它可以设置两个与同一个对象共享相同“键”的对象(所以我在set()中没有重复项)?我正在寻找一个非常简单的实现:)
答案 0 :(得分:1)
您必须实施自己的__hash__
和__eq__
方法,以确保在构建集合时它们被视为相等:
class Sample(object):
def __init__(self, key):
self.key = key
def __hash__(self):
return hash(self.key)
def __eq__(self, other):
return self.key == other.key
答案 1 :(得分:0)
尝试实施__hash__
,__cmp__
和__eq__
方法。来自相关的documentation:
可哈希
如果对象具有永不更改的哈希值,则该对象是可清除的 在它的生命周期中(它需要一个__hash __()方法),并且可以 与其他对象相比(它需要__eq __()或__cmp __()方法)。 比较相等的Hashable对象必须具有相同的哈希值。
Hashability使对象可用作字典键和集合 member,因为这些数据结构在内部使用哈希值。
在您的实现中,您可以转到密钥字符串的相应方法。