我正在尝试创建一个简单的映射类,其中当键为1-1时,例如key1:key2, key2:key1
。当我检查班级是否等于我输入的值时,我遇到了一个错误,我应该得到True
但我一直得到False
。
>>> m=Mapping()
>>> m[2]=3
>>> m
Mapping({2: 3, 3: 2})
>>> m==Mapping({2: 3, 3: 2})
False
我不确定我做错了什么,我的代码在下面,任何帮助将不胜感激。
class Mapping():
def __init__(self, dic={}):
self.Dict = dict(dic)
def __repr__(self):
return "Mapping({})".format(self.Dict)
def __getitem__(self, loc=0):
return self.Dict[loc]
def pop(self, popn=0):
popm = self.Dict[popn]
self.Dict.pop(popn, None)
self.Dict.pop(popm, None)
def __setitem__(self, x, y):
self.Dict[x]=y
self.Dict[y]=x
你的Mapping
类必须实现__eq__
魔法,才能使==
正常工作。如果Mappings
相等,假设两个Dict
相等,你可以试试这样的:
def __eq__(self, other):
if isinstance(other, Mapping):
return self.Dict == other.Dict
return False
如果没有这个,==
将回过头来检查这些是否是同一个实例,即is
的作用。
通常,当你实现__eq__
时,你也会实现__hash__
方法,所以两者是一致的。同样,您可以简单地委托self.Dict
获取哈希值,但dict
不可清除(有充分理由,请参阅下文),但您可以对项目进行哈希处理:
def __hash__(self):
return hash(frozenset(self.Dict.items()))
没有__hash__
,你可以例如不要将你的Mapping
类用作另一个字典中的键。然而,这种设置是有问题的,因为dict
是可变的,所以hash(m)
可能会在使用之间发生变化,因此无法在以后从Mapping
或dict
中检索set
。