我做错了什么(在python中实现重载的替代等式)

Rom*_*her 1 python equality wrapper

一个人问了一个关于如何使用替代的相等函数在python中获取列表唯一函数的问题.

我认为可以通过继承元素类并重载相等函数来完成

import functools
@functools.total_ordering
class ffloat(float):
def __eq__(self,other):
    if floor(self) == floor(other):
        return True
    else:
        return False
def __le__(self,other):
    if self == other:
        return True
    else:
        return float(self) <= float(other)
def __hash__(self):
    return floor(self)


a = map(ffloat,[4.3,8,8.9, 13])


In [41]: a[1] == a[2]
Out[41]: True
Run Code Online (Sandbox Code Playgroud)

In [42]: set(a)
Out[42]: set([4.3, 8.0, 8.9, 13.0])
Run Code Online (Sandbox Code Playgroud)

编辑:用平面相等替换abs <1.5相等
添加Hash PS有一种方法可以使一个类和两个lambda创建一个类工厂,并返回一个继承第一个类的类,覆盖所需的相等函数.

phi*_*hag 8

这不是一个有效的相等函数,因为它不是传递函数:

mfloat(0) == mfloat(1) == mfloat(2)但是mfloat(0) != mfloat(2).

另请注意,要在集合中使用,必须覆盖__hash__以便以下属性适用于您的类的所有实例a,b:

a == b ? hash(a) == hash(b)
Run Code Online (Sandbox Code Playgroud)

设置发现了hash(mfloat(8)) != hash(mfloat(9)).由于set假设上述属性成立,因此它得出的结论是mfloat(8) != mfloat(9)没有实际调用__eq__.


总之,这有效:

from math import floor
class ffloat(float):
    def __eq__(self,other):
        return floor(self) == floor(other):
    def __hash__(self):
        return floor(self)

a = map(ffloat,[4.3,8,8.9, 13])
print(set(a))
# output: {8.0, 4.3, 13.0}
Run Code Online (Sandbox Code Playgroud)