Python面向对象编程第12篇 特殊方法之__eq__

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面向对象编程第12篇 特殊方法之__eq__相关的知识,希望对你有一定的参考价值。

本篇我们学习如何利用 Python __eq__ 方法比较两个对象。

eq 方法简介

以下是一个 Person 类,包含了三个属性:first_name、last_name 以及 age。

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

然后我们创建两个 Person 类的实例:

john = Person('John', 'Doe', 25)
jane = Person('Jane', 'Doe', 25)

其中,john 和 jane 是两个不同的对象,我们可以使用 is 操作符检查它们是否相同:

print(john is jane)  # False

另外,当我们使用相等运算符(==)比较 john 和 jane 时,将会返回结果 False:

print(john == jane) # False

由于 john 和 jane 的年龄相同,我们认为他们相同。也就是说,我们希望以下表达式的结果为 True:

john == jane

为此,我们可以实现 Person 类的特殊方法 __eq__。当我们使用 == 运算符比较两个实例时,Python 会自动调用 __eq__ 方法。默认情况下,Python 使用的是 is 操作符。

以下示例实现了 Person 类的 __eq__ 方法,当两个 Person 对象的年龄相同时返回 True:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

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

我们再次比较 john 和 jane:

john = Person('John', 'Doe', 25)
jane = Person('Jane', 'Doe', 25)
print(john == jane)  # True

如果两个 Person 实例的年龄不同,== 运算符的结果仍然为 False:

john = Person('John', 'Doe', 25)
mary = Person('Mary', 'Doe', 27)
print(john == mary)  # False

以下示例将一个 Person 对象和整数进行比较:

john = Person('John', 'Doe', 25)
print(john == 20)
AttributeError: 'int' object has no attribute 'age'

代码返回了一个错误,因为整数对象没有 age 属性。

为了解决上面的问题,我们可以修改 __eq__ 方法,在访问 age 属性之前检查对象是否为 Person 类的实例。如果 other 对象不是 Person 类的实例,__eq__ 方法返回 False,例如:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def __eq__(self, other):
        if isinstance(other, Person):
            return self.age == other.age

        return False

现在我们可以比较 Person 对象和整数或任何类型的对象:

john = Person('John', 'Doe', 25)
print(john == 20)  # False

完整的示例代码如下:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def __eq__(self, other):
        if isinstance(other, Person):
            return self.age == other.age

        return False


john = Person('John', 'Doe', 25)
jane = Person('Jane', 'Doe', 25)
mary = Person('Mary', 'Doe', 27)

print(john == jane)  # True
print(john == mary)  # False


john = Person('John', 'Doe', 25)
print(john == 20)  # False

总结

  • Python __eq__ 方法用于定义使用相等运算符(==)比较两个对象时的逻辑。

以上是关于Python面向对象编程第12篇 特殊方法之__eq__的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象编程第14篇 特殊方法之__bool__

Python面向对象编程第14篇 特殊方法之__bool__

Python面向对象编程第15篇 特殊方法之__del__

Python面向对象编程第15篇 特殊方法之__del__

Python面向对象编程第13篇 特殊方法之__hash__

Python面向对象编程第13篇 特殊方法之__hash__