我正在尝试创建一个简单的映射类,其中当键为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
答案 0 :(得分:6)
您的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
或{{1}检索dict
以后。