Python 整数子类散列
我有几个Python 整数子类散列,python,python-3.x,hash,Python,Python 3.x,Hash,我有几个int子类,它们代表不同的范围。它们的一些行为在抽象类中是共享的,我希望它们之间可以比较,可以与普通整数进行比较,但不能与其他不同的范围进行比较。散列保持与整数相同,因此会发生冲突,但我认为这不是问题,因为将执行相等性检查来解决散列冲突 从abc导入abc,abstractmethod 类别范围(整数,ABC): @类方法 @财产 @抽象方法 def最小值(自)->int: 引发未实现的错误 @类方法 @财产 @抽象方法 def最大值(自身)->int: 引发未实现的错误 定义初始化(s
int
子类,它们代表不同的范围。它们的一些行为在抽象类中是共享的,我希望它们之间可以比较,可以与普通整数进行比较,但不能与其他不同的范围进行比较。散列保持与整数相同,因此会发生冲突,但我认为这不是问题,因为将执行相等性检查来解决散列冲突
从abc导入abc,abstractmethod
类别范围(整数,ABC):
@类方法
@财产
@抽象方法
def最小值(自)->int:
引发未实现的错误
@类方法
@财产
@抽象方法
def最大值(自身)->int:
引发未实现的错误
定义初始化(self,*args,**kwargs):
super()。\uuuu init\uuuuu()
#检查下限和上限
如果不是(self.min bool:
自我检查其他(其他)
返回整数(自)布尔值:
自我检查其他(其他)
返回整数(自身)>整数(其他)
定义(自身、其他)->布尔:
自我检查其他(其他)
返回整数(自身)>=整数(其他)
__哈希值=int.\uuuu哈希值__
等级范围20(范围):
最小值=1
最大值=20
等级范围100(范围):
最小值=1
最大值=100
m={
范围20(1):-1,
范围20(2):-2,
范围100(1):1,
范围100(2):2,
}
断言范围20(1)==1,“范围20(1)!=1”
断言范围20(1)!=2,“范围20(1)==2”
断言Range20(1)=Range20(1),“Range20(1)!=Range20(1)”
断言Range20(1)!=Range20(2),“Range20(1)==Range20(2)”
断言Range20(1)!=Range100(1),“Range20(1)==Range100(1)”
断言不(Range20(1)=Range100(1)),“Range20(1)=Range100(1)之二”
断言范围20(2)>1,“范围20(2)=3”
断言范围20(2)范围20(1),“范围20(2)=范围20(3)”
assert Range20(2)在这里更改此部分对我有效(除了assert 17失败——它实际上与之前的相等性测试不一致,除非您希望我在您的问题中遗漏了其他内容):
@MoeNeuron引导我朝着正确的方向前进,通过添加一些额外的断言,我发现assertrange20(1)=Range20(1)
失败。我认为通过返回NotImplemented
int方法可以处理这些情况,但似乎不行。解决方案是使用以下两种修改过的方法:
def\uuuuu eq\uuuuu(自身、其他):
如果存在(其他,范围):
如果不存在(其他、自身类):
#如果它们是范围元素但不是来自同一范围
返回错误
#如果它们是来自同一范围的范围元素
返回int(自身)==int(其他)
#如果它们不是范围元素,则委托给int
返回未执行
定义(自身、其他):
如果存在(其他,范围):
如果不存在(其他、自身类):
#如果它们是范围元素但不是来自同一范围
返回真值
#如果它们是来自同一范围的范围元素
返回整数(自身)!=整数(其他)
#如果它们不是范围元素,则委托给int
返回未执行
使用这些修改过的方法,只有最后一个断言失败,正如我在问题中所说,这是可以接受的。这实际上会使assert Range20(1)=Range20(2)
pass,我不希望发生这种情况。我以为我已经添加了足够的断言,但似乎没有。不管你的回答给了我什么想法,我都会带着结果回来。
def __eq__(self, other):
# If they are a range but not the same one just return False
if isinstance(other, Range) and not isinstance(other, self.__class__):
return False
elif isinstance(other, Range) and isinstance(other, self.__class__):
return True
return NotImplemented
def __ne__(self, other):
# If they are a range but not the same one just return True
if isinstance(other, Range) and not isinstance(other, self.__class__):
return True
elif isinstance(other, Range) and isinstance(other, self.__class__):
return False
return NotImplemented