Это не допустимая функция равенства, так как она не транзитивная :
mfloat(0) == mfloat(1) == mfloat(2)
, но mfloat(0) != mfloat(2)
.
Также обратите внимание, что дляПри использовании в наборе вы должны переопределить __hash__
, чтобы для всех экземпляров a, b вашего класса выполнялось следующее свойство:
a == b ⇒ hash(a) == hash(b)
set обнаруживает, что 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}