from dataclasses import dataclass
@dataclass
class ThreeDPoint:
x: int | float
y = 0.0
z: int | float = 0.0
point_1 = ThreeDPoint(1.0,2)
point_3 = ThreeDPoint(1,2)
print(point_1 == point_3)
结果是真的。
我在 python 游乐场上运行了它。结果说是真的。我认为这个数据类模块可能会在内部发挥一些魔法,但我不确定到底发生了什么。
1.0 在 python 中等于 1,因此
1.0 == 1
将返回 true。
就像 Barmar 所说,当您比较数据类时,您是在使用实例的属性来比较实例,所以
1.0 == 1
是真的。
2 == 2
是真的
因此,
ThreeDPoint(1.0,2) == ThreeDPoint(1,2)
为真。
没有什么魔术。在Python中,整数1和浮点1.0是相同的
> 1 == 1.0
True
另一方面,type(1) 与 type(1.0) 不同
> type(1) == type(1.0)
False
如果您希望相等运算符按照您建议的方式运行(= 当 x 具有相同值但不同类型时返回 False),那么您可以为该类定义自己的相等方法,如下所示:
from dataclasses import dataclass
@dataclass
class ThreeDPoint:
x: int | float
y = 0.0
z: int | float = 0.0
def __eq__(self, other):
for var, var_value in self.__dict__.items():
try:
other_var_value = getattr(other, var, False)
if not (var_value == other_var_value and type(var_value) == type(other_var_value)):
return False
except AttributeError:
return False
return True
point_1 = ThreeDPoint(1.0, 2)
point_3 = ThreeDPoint(1, 2)
print(point_1 == point_3)