Métodos Mágicos em Python: Personalize o Comportamento das Suas Classes
Tags: braziliandevs, beginners, python
Published: 2023-08-13 17:05:28

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:

```python
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})"
```

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:

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

```

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:

```python
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

```

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 (<, <=, >, >=)

```python
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.

```

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