本篇我们学习如何利用 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)
另外,当我们使用相等运算符(==)比较 john 和 jane 时,将会返回结果 False:
print(john == jane)
由于 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)
如果两个 Person 实例的年龄不同,== 运算符的结果仍然为 False:
john = Person('John', 'Doe', 25)
mary = Person('Mary', 'Doe', 27)
print(john == mary)
以下示例将一个 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)
完整的示例代码如下:
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)
print(john == mary)
john = Person('John', 'Doe', 25)
print(john == 20)
总结
- Python __eq__ 方法用于定义使用相等运算符(==)比较两个对象时的逻辑。
|