Python 3.x 如何在Python中使用可变字段创建可散列和可比较的自定义对象?

Python 3.x 如何在Python中使用可变字段创建可散列和可比较的自定义对象?,python-3.x,oop,hash,Python 3.x,Oop,Hash,我想用可变字段定义一个可散列类,但如果我自己定义\uuuuueq\uuuuu方法(这是我绝对想做的),它在默认情况下不再是可散列的,我还需要定义\uuuuhash\uuuuuu方法 如果我定义了\uuuuuuuuuuuuuuuuuuuuuuuu方法,这样它就比较了id()值,就像我在定义\uuuuuueq\uuuuuuuuu之前默认做的那样,我会得到奇怪的结果 根据,我必须以与\uuuuu hash\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu相同的方式定义\uuuuu

我想用可变字段定义一个可散列类,但如果我自己定义
\uuuuueq\uuuuu
方法(这是我绝对想做的),它在默认情况下不再是可散列的,我还需要定义
\uuuuhash\uuuuuu
方法

如果我定义了
\uuuuuuuuuuuuuuuuuuuuuuuu
方法,这样它就比较了
id()
值,就像我在定义
\uuuuuueq\uuuuuuuuu
之前默认做的那样,我会得到奇怪的结果

根据,我必须以与
\uuuuu hash\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
相同的方式定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

具体来说,我想用两个包含整数的可变字段定义对象:

class CustomObj:
    def __init__(self, a, b):
        self.a = a
        self.b = b

ObjA = CustomObj(1, 2)
ObjB = CustomObj(1, 2)
我希望能够将它们相互比较
ObjA==ObjB
,以及简单元组
ObjA==(1,2)
。我还希望能够将它们存储在一个集合
myset=set()。我怎样才能做到这一点

这是我目前的代码,但它的行为肯定不正确:

class Agent:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        try:
            # Try comparing two agents
            return (self.x == other.x and self.y == other.y
                        and isinstance(other, Agent))
        except AttributeError:
            # If it fails, compare an agent and a tuple
            if isinstance(other, tuple) and len(other) == 2:
                return self.x == other[0] and self.y == other[1]
            else:
                return NotImplemented

    def __hash__(self):
        return id(self)