Python中字典与集合的实现原理
首先通过__new__方法创建对象,__init__方法进行属性绑定后,将对象添加到一个集合中,会自动调用__hash__方法的到哈希值,哈希值相等是会调用__eq__方法,会返回一个结果,如果返回结果为False怎添加成功。
class CanHash(object):
def __new__(cls, *args, **kwargs):
obj=object.__new__(cls)
print(f"__new__方法创建了一个新对象id:{id(obj)}")
return obj
def __init__(self,value):
print(f"__init__方法为对象绑定了attrs,id::{id(self)}")
self.value=value
def __hash__(self):
print("__hash__方法被调用了")
hash_value=hash(self.value)
print(f'hash_value:{hash_value}')
return hash_value
def __eq__(self, other):
print("__eq__方法被调用了")
if isinstance(other,self.__class__):
res= self.value == other.value
print(f"hash桶内是同一个对象吗?{res}")
return res
else:
print("不是同类对象,add失败")
return False
c1=CanHash('a')
c2=CanHash('b')
c3=CanHash('c')
c4=CanHash('b')
s=set()
s.add(c1)
s.add(c2)
s.add(c3)
s.add(c4)
print(f"添加结果:{s}")
__new__方法创建了一个新对象id:139999721527712
__init__方法为对象绑定了attrs,id::139999721527712
__new__方法创建了一个新对象id:139999721209376
__init__方法为对象绑定了attrs,id::139999721209376
__new__方法创建了一个新对象id:139999721208416
__init__方法为对象绑定了attrs,id::139999721208416
__new__方法创建了一个新对象id:139999720858960
__init__方法为对象绑定了attrs,id::139999720858960
__hash__方法被调用了
hash_value:6082891539820400838
__hash__方法被调用了
hash_value:-575605371910081896
__hash__方法被调用了
hash_value:7415995645675622067
__hash__方法被调用了
hash_value:-575605371910081896
__eq__方法被调用了
hash桶内是同一个对象吗?True
添加结果:{<__main__.CanHash object at 0x7f5439a6be20>, <__main__.CanHash object at 0x7f5439a6ba60>, <__main__.CanHash object at 0x7f5439ab99a0>}