DEV Community

Cover image for Métodos Mágicos em Python: Personalize o Comportamento das Suas Classes
Endriw Villa
Endriw Villa

Posted on • Edited on

Métodos Mágicos em Python: Personalize o Comportamento das Suas Classes

Depois de muito tempo tentando entender a fundo sobre o assunto resolvi fazer um post sobre os Métodos Mágicos

Os métodos mágicos em Python são uma das características mais poderosas e interessantes da linguagem. Eles permitem que você defina comportamentos personalizados para suas classes, que são executados automaticamente em resposta a eventos específicos, como a criação de um objeto ou a representação de um objeto como uma string.

Esses métodos são chamados de mágicos porque eles começam e terminam com dois caracteres de sublinhado. Por exemplo, o método __init__ é chamado quando um objeto é criado, enquanto o método __str__ é chamado quando um objeto é convertido em uma string.

Vamos ver alguns exemplos de métodos mágicos magicando:

class Pessoa:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    def __str__(self):
        return f"{self.nome} tem {self.idade} anos."

    def __repr__(self):
        return f"Pessoa('{self.nome}', {self.idade})"
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, temos uma classe Pessoa com três métodos mágicos definidos: __init__, __str__ e __repr__.

O método __init__ é usado para inicializar o objeto com o nome e a idade da pessoa. Quando um objeto Pessoa é criado, o método __init__ é chamado automaticamente com os argumentos fornecidos.

O método __str__ é usado para definir como o objeto deve ser representado como uma string. Neste caso, estamos retornando uma string que contém o nome e a idade da pessoa.

O método __repr__ é semelhante ao método __str__, mas é usado para representar o objeto como uma string que pode ser usada para criar um novo objeto com os mesmos valores. Neste caso, estamos retornando uma string que contém o nome e a idade da pessoa, formatada de forma que possa ser usada para criar uma nova instância da classe Pessoa.

Com esses métodos mágicos definidos, podemos criar objetos Pessoa e convertê-los em strings ou representações de string:

pessoa1 = Pessoa("João", 30)
print(pessoa1) # João tem 30 anos
print(repr(pessoa1)) # Pessoa('João', 30)

Enter fullscreen mode Exit fullscreen mode

Também podemos usar esses métodos para personalizar o comportamento de outras operações em nossas classes. Por exemplo, podemos definir os métodos __eq__ e __lt__ para permitir que objetos Pessoa sejam comparados uns com os outros:

class Pessoa:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    def __str__(self):
        return f"{self.nome} tem {self.idade} anos."

    def __repr__(self):
        return f"Pessoa('{self.nome}', {self.idade})"

    def __eq__(self, other):
        if not isinstance(other, Pessoa):
            return NotImplemented
        return self.nome == other.nome and self.idade == other.idade

    def __lt__(self, other):
        if not isinstance(other, Pessoa):
            return NotImplemented
        return self.idade < other.idade

Enter fullscreen mode Exit fullscreen mode

Neste exemplo, definimos os métodos __eq__ e __lt__ para permitir que objetos Pessoa sejam
comparados uns com os outros. O método __eq__ é usado para verificar se dois objetos Pessoa são iguais, enquanto o método __lt__ é usado para determinar se um objeto Pessoa é menor que outro em termos de idade.

Com esses métodos definidos, podemos comparar objetos Pessoa com o operador == e os operadores de comparação (<, <=, >, >=)

pessoa1 = Pessoa("João", 30)
pessoa2 = Pessoa("Maria", 25)
pessoa3 = Pessoa("João", 30)

print(pessoa1 == pessoa2) # False
print(pessoa1 == pessoa3) # True

pessoas = [pessoa1, pessoa2, pessoa3]
pessoas_ordenadas = sorted(pessoas)

for pessoa in pessoas_ordenadas:
    print(pessoa) # Maria tem 25 anos., João tem 30 anos., João tem 30 anos.

Enter fullscreen mode Exit fullscreen mode

Neste exemplo, criamos três objetos Pessoa com nomes e idades diferentes e os comparamos usando os métodos __eq__ e __lt__

Também criamos uma lista de objetos Pessoa e os ordenamos usando a função sorted e o método __lt__

Como você pode ver, os métodos mágicos em Python são uma ferramenta poderosa para personalizar o comportamento das suas classes e permitir que elas sejam usadas de maneira mais intuitiva e flexível. Com a prática e a experimentação, você pode descobrir ainda mais maneiras de usar esses métodos para tornar sua programação Python mais eficiente e elegante

Top comments (0)