为什么这2个Python类实例可以彼此相等?

问题描述 投票:0回答:2
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 游乐场上运行了它。结果说是真的。我认为这个数据类模块可能会在内部发挥一些魔法,但我不确定到底发生了什么。

python equality python-dataclasses python-class
2个回答
0
投票

1.0 在 python 中等于 1,因此

1.0 == 1
将返回 true。 就像 Barmar 所说,当您比较数据类时,您是在使用实例的属性来比较实例,所以

1.0 == 1
是真的。

2 == 2
是真的

因此,

ThreeDPoint(1.0,2) == ThreeDPoint(1,2)
为真。


-1
投票

没有什么魔术。在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)
© www.soinside.com 2019 - 2024. All rights reserved.