2

有没有让我可以做的功能

class Test():
    def __init__(self):
        self.value_1 = 42

x = Test()
y = Test()
deepequals(x, y) == True
x.value = 7
deepequals(x, y) == False
y.value = 7
deepequals(x, y) == True

但是,默认情况下,它始终为 false,因为 x 和 y 是不同的 Test 实例

4

3 回答 3

1

您可以实现__eq__(等于)“魔术方法”:

class Test():
    def __init__(self):
        self.value_1 = 42
    def __eq__(self, other):
        return self.__dict__ == other.__dict__

其中__dict__包含所有实例属性。True当两个对象的所有相同属性的值都相同时,这将返回。这给出了你想要的结果:

>>> x = Test()
>>> y = Test()
>>> x == y
True
>>> x.value = 7
>>> x == y
False
>>> y.value = 7
>>> x == y
True

要支持与没有__dict__属性的对象进行比较(例如在 C 中定义或使用的对象__slots__),您可以先使用以下命令检查该属性hasattr

return hasattr(other, '__dict__') and self.__dict__ == other.__dict__

或使用getattr默认值安全地访问它:

return self.__dict__ == getattr(other, '__dict__', None)
于 2014-03-11T18:01:20.387 回答
0

您可能想要实现__eq__您的课程。然后您可以使用标准比较运算符:

class Test():
    def __init__(self):
        self.value = 42

    def __eq__ (self, other):
        return self.value == other.value

x = Test()
y = Test()
print (x == y)
x.value = 7
print (x == y)
y.value = 7
print (x == y)
于 2014-03-11T18:02:41.233 回答
0
class Test:
    def __init__(self):
        self.value_1 = 42
        
    def __eq__(self, other):
        return (
             self.__class__ == other.__class__ and
             self.value_1 == other.value_1)

t1 = Test()
t2 = Test()
print(t1 == t2)

输出

True
于 2020-09-20T11:19:50.330 回答