测试1
代码:
class Test:
def __init__(self, id: int, name: str):
self.__id = id
self.__name = name
pass
def get_name(self):
return self.__name
def set_name(self, name: str):
self.__name = name
def get_id(self):
return self.__id
def __eq__(self, o):
if isinstance(o, self.__class__):
return self.__id == o.get_id()
else:
return False
def __ne__(self, o):
if isinstance(o, self.__class__):
return self.__id != o.get_id()
else:
return True
def __hash__(self):
return hash(self.__id)
def __str__(self):
return '{"id": %s, "name": %s}' % (self.__id, self.__name)
u = set([Test(0, 'q'), Test(0, 'q'), Test(1, 'w'), Test(1, 'q'),
Test(2, 'e'), Test(3, 'r'), Test(4, 't'), Test(5, 'y'),
Test(6, 'u'), Test(7, 'iop'), Test(8, 'asd'), Test(9, 'fgh'), ])
print(u)
for i in u:
print(i)
控制台:
{<__main__.Test object at 0x000002889F28A280>, <__main__.Test object at 0x000002889F28A4C0>, <__main__.Test object at 0x000002889F2D4E20>, <__main__.Test object at 0x000002889F172880>, <__main__.Test object at 0x000002889F404040>, <__main__.Test object at 0x000002889F4040A0>, <__main__.Test object at 0x000002889F404100>, <__main__.Test object at 0x000002889F404160>, <__main__.Test object at 0x000002889F4041C0>, <__main__.Test object at 0x000002889F404220>}
{"id": 0, "name": q}
{"id": 1, "name": w}
{"id": 2, "name": e}
{"id": 3, "name": r}
{"id": 4, "name": t}
{"id": 5, "name": y}
{"id": 6, "name": u}
{"id": 7, "name": iop}
{"id": 8, "name": asd}
{"id": 9, "name": fgh}
在当对象在集合中时将集合打印,对象重写的__str__
压根不调用,断点没触发。
测试2
代码:
class Test:
def __init__(self, id: int, name: str):
self.__id = id
self.__name = name
pass
def get_name(self):
return self.__name
def set_name(self, name: str):
self.__name = name
def get_id(self):
return self.__id
# def __eq__(self, o):
# if isinstance(o, self.__class__):
# return self.__id == o.get_id()
# else:
# return False
# def __ne__(self, o):
# if isinstance(o, self.__class__):
# return self.__id != o.get_id()
# else:
# return True
def __hash__(self):
return hash(self.__id)
def __str__(self):
return '{"id": %s, "name": %s}' % (self.__id, self.__name)
u = set([Test(0, 'q'), Test(0, 'q'), Test(1, 'w'), Test(1, 'q'),
Test(2, 'e'), Test(3, 'r'), Test(4, 't'), Test(5, 'y'),
Test(6, 'u'), Test(7, 'iop'), Test(8, 'asd'), Test(9, 'fgh'), ])
print(u)
for i in u:
print(i)
控制台:
{<__main__.Test object at 0x000001AD3921A280>, <__main__.Test object at 0x000001AD3921A310>, <__main__.Test object at 0x000001AD39264C10>, <__main__.Test object at 0x000001AD39264FA0>, <__main__.Test object at 0x000001AD39264F40>, <__main__.Test object at 0x000001AD39264F10>, <__main__.Test object at 0x000001AD39264FD0>, <__main__.Test object at 0x000001AD39102820>, <__main__.Test object at 0x000001AD3939C070>, <__main__.Test object at 0x000001AD3939C0D0>, <__main__.Test object at 0x000001AD3939C130>, <__main__.Test object at 0x000001AD3939C190>}
{"id": 0, "name": q}
{"id": 0, "name": q}
{"id": 2, "name": e}
{"id": 1, "name": w}
{"id": 1, "name": q}
{"id": 3, "name": r}
{"id": 4, "name": t}
{"id": 5, "name": y}
{"id": 6, "name": u}
{"id": 7, "name": iop}
{"id": 8, "name": asd}
{"id": 9, "name": fgh}
去重失败,__eq__
输出两个id为0的对象不相等,所以全加进了集合
测试3
代码
class Test:
def __init__(self, id: int, name: str):
self.__id = id
self.__name = name
pass
def get_name(self):
return self.__name
def set_name(self, name: str):
self.__name = name
def get_id(self):
return self.__id
def __eq__(self, o):
if isinstance(o, self.__class__):
return self.__id == o.get_id()
else:
return False
def __ne__(self, o):
if isinstance(o, self.__class__):
return self.__id != o.get_id()
else:
return True
# def __hash__(self):
# return hash(self.__id)
def __str__(self):
return '{"id": %s, "name": %s}' % (self.__id, self.__name)
u = set([Test(0, 'q'), Test(0, 'q'), Test(1, 'w'), Test(1, 'q'),
Test(2, 'e'), Test(3, 'r'), Test(4, 't'), Test(5, 'y'),
Test(6, 'u'), Test(7, 'iop'), Test(8, 'asd'), Test(9, 'fgh'), ])
print(u)
for i in u:
print(i)
控制台:
Traceback (most recent call last):
File "C:/Users/Administrator/test.py", line 35, in <module>
u = set([Test(0, 'q'), Test(0, 'q'), Test(1, 'w'), Test(1, 'q'),
TypeError: unhashable type: 'Test'
如果写了__eq__
则__hash__
不能省略。
测试4
代码
class Test:
def __init__(self, id: int, name: str):
self.__id = id
self.__name = name
pass
def get_name(self):
return self.__name
def set_name(self, name: str):
self.__name = name
def get_id(self):
return self.__id
# def __eq__(self, o):
# if isinstance(o, self.__class__):
# return self.__id == o.get_id()
# else:
# return False
# def __ne__(self, o):
# if isinstance(o, self.__class__):
# return self.__id != o.get_id()
# else:
# return True
# def __hash__(self):
# return hash(self.__id)
def __str__(self):
return '{"id": %s, "name": %s}' % (self.__id, self.__name)
u = set([Test(0, 'q'), Test(0, 'q'), Test(1, 'w'), Test(1, 'q'),
Test(2, 'e'), Test(3, 'r'), Test(4, 't'), Test(5, 'y'),
Test(6, 'u'), Test(7, 'iop'), Test(8, 'asd'), Test(9, 'fgh'), ])
print(u)
for i in u:
print(i)
控制台:
{<__main__.Test object at 0x000001E8A0EE4C10>, <__main__.Test object at 0x000001E8A0D82820>, <__main__.Test object at 0x000001E8A101C070>, <__main__.Test object at 0x000001E8A0E9A280>, <__main__.Test object at 0x000001E8A0EE4E80>, <__main__.Test object at 0x000001E8A101C0D0>, <__main__.Test object at 0x000001E8A0E9A310>, <__main__.Test object at 0x000001E8A0EE4F10>, <__main__.Test object at 0x000001E8A101C130>, <__main__.Test object at 0x000001E8A0EE4F40>, <__main__.Test object at 0x000001E8A0EE4FA0>, <__main__.Test object at 0x000001E8A0EE4FD0>}
{"id": 3, "name": r}
{"id": 6, "name": u}
{"id": 7, "name": iop}
{"id": 0, "name": q}
{"id": 1, "name": w}
{"id": 8, "name": asd}
{"id": 0, "name": q}
{"id": 4, "name": t}
{"id": 9, "name": fgh}
{"id": 2, "name": e}
{"id": 1, "name": q}
{"id": 5, "name": y}
哈希表逻辑上无序,但是遍历时却按照存储的顺序遍历。