Resumo : neste tutorial, você aprenderá como usar o __eq__
método Python para comparar dois objetos por seus valores.
Introdução ao __eq__
método Python
Suponha que você tenha a seguinte Person
classe com três atributos de instância: first_name
, last_name
e age
:
class Person:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
Linguagem de código: Python ( python )
E você cria duas instâncias da Person
classe:
john = Person('John', 'Doe', 25)
jane = Person('Jane', 'Doe', 25)
Linguagem de código: Python ( python )
Neste exemplo, os objetos john
e jane
não são o mesmo objeto. E você pode verificar isso usando o is
operador :
print(john is jane) # False
Linguagem de código: Python ( python )
Além disso, ao comparar john
com jane
o uso do operador igual (==), você obterá o resultado Falso:
print(john == jane) # False
Linguagem de código: Python ( python )
Como john
e jane
têm a mesma idade, você quer que eles sejam iguais. Em outras palavras, você deseja que a seguinte expressão retorne True
:
john == jane
Para fazer isso, você pode implementar o __eq__
método dunder na Person
classe.
Python chama automaticamente o __eq__
método de uma classe quando você usa o operador == para comparar as instâncias da classe. Por padrão, o Python usa o is
operador se você não fornecer uma implementação específica para o método __eq__.
A seguir mostramos como implementar o __eq__
método na Person
classe que retorna True
se dois objetos pessoais tiverem a mesma idade:
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
Linguagem de código: Python ( python )
Agora, se você comparar duas instâncias da Person
classe com a mesma idade, ele retornará True:
john = Person('John', 'Doe', 25)
jane = Person('Jane', 'Doe', 25)
print(john == jane) # True
Linguagem de código: Python ( python )
E se duas instâncias da classe Person não tiverem a mesma idade, o operador == retornará False:
john = Person('John', 'Doe', 25)
mary = Person('Mary', 'Doe', 27)
print(john == mary) # False
Linguagem de código: Python ( python )
O seguinte compara um Person
objeto com um número inteiro:
john = Person('John', 'Doe', 25)
print(john == 20)
Linguagem de código: PHP ( php )
Ele retorna um erro:
AttributeError: 'int' object has no attribute 'age'
Linguagem de código: JavaScript ( javascript )
Para corrigir isso, você pode modificar o __eq__
método para verificar se o objeto é uma instância da Person
classe antes de acessar o age
atributo.
Se o outro objeto não for uma instância da Person
classe, o __eq__
método retornará False
, assim:
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
Linguagem de código: Python ( python )
E agora você pode comparar uma instância da Person
classe com um número inteiro ou qualquer objeto de tipo diferente:
john = Person('John', 'Doe', 25)
print(john == 20) # False
Linguagem de código: Python ( python )
Juntando tudo.
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
Linguagem de código: Python ( python )
Resumo
- Implemente o
__eq__
método Python para definir a lógica de igualdade para comparar dois objetos usando o operador igual (==
)