python set() def __hash__(self):

测试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}

哈希表逻辑上无序,但是遍历时却按照存储的顺序遍历。

猜你喜欢

转载自blog.csdn.net/dscn15848078969/article/details/115393138
def