Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 整数子类散列_Python_Python 3.x_Hash - Fatal编程技术网

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