Python__eq__

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 Personclasse com três atributos de instância: first_name, last_namee age:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = ageLinguagem de código:  Python  ( python )

E você cria duas instâncias da Personclasse:

john = Person('John', 'Doe', 25)
jane = Person('Jane', 'Doe', 25)Linguagem de código:  Python  ( python )

Neste exemplo, os objetos johne janenão são o mesmo objeto. E você pode verificar isso usando o isoperador :

print(john is jane)  # FalseLinguagem de código:  Python  ( python )

Além disso, ao comparar johncom janeo uso do operador igual (==), você obterá o resultado Falso:

print(john == jane) # FalseLinguagem de código:  Python  ( python )

Como johne janetê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 Personclasse.

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 isoperador 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 Personclasse que retorna Truese 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.ageLinguagem de código:  Python  ( python )

Agora, se você comparar duas instâncias da Personclasse com a mesma idade, ele retornará True:

john = Person('John', 'Doe', 25)
jane = Person('Jane', 'Doe', 25)
print(john == jane)  # TrueLinguagem 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)  # FalseLinguagem de código:  Python  ( python )

O seguinte compara um Personobjeto 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 Personclasse antes de acessar o ageatributo.

Se o outro objeto não for uma instância da Personclasse, 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 FalseLinguagem de código:  Python  ( python )

E agora você pode comparar uma instância da Personclasse com um número inteiro ou qualquer objeto de tipo diferente:

john = Person('John', 'Doe', 25)
print(john == 20)  # FalseLinguagem 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)  # FalseLinguagem 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 ( ==)

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *