【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__ 方法用于定义使用相等运算符(==)比较两个对象时的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不剪发的Tony老师

为 5 个 C 币而折腰。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值