• Python
  • 12. Python intermediário
  • Classes

Classes

Implementando o construtor

Exercício 1

Podemos modificar a nossa classe para que ela receba como argumentos os valores das coordenadas assim que um novo ponto é criado. Modifique sua classe no arquivo classes.py para:

class Point:
    def __init__(self, x_coord, y_coord):
        self.x = x_coord
        self.y = y_coord

Rode o programa exemplo.py. Deve ocorrer um erro. Escreva aqui qual o nome desse erro:

Resposta

O programa deve ter dado o seguinte erro:

TypeError: __init__() missing 2 required positional arguments: 'x_coord' and 'y_coord'

Vamos consertá-lo no próximo exercício.

Exercício 2

Modifique o arquivo exemplo.py para:

ponto = Point(4, 1)
print(f'O ponto está nas coordenadas x={ponto.x} e y={ponto.y}')

Ao testar o código acima, o que foi impresso no terminal?

Resposta

Perceba que os valores para self.x e self.y não são mais definidos como o valor 0. Trocamos os 0`s pelos argumentos x_coord e x_coord.

A função __init__ é um tipo de função especial que é chamada quando o novo ponto é criado. Duas observações importantes:

  • São dois underscores no começo e dois underscores no fim (chamamos esse par de dois underscores de dunder, ou double underscore);
  • Essas funções que fazem parte de uma classe sempre recebem um primeiro argumento chamado self. Ele é uma variável que guarda o próprio objeto1. No nosso exemplo, self é o próprio ponto. Por isso, quando fazemos self.x = 0 estamos guardando na variável (atributo) x desse ponto específico o valor 0.

Talvez você tenha notado que ao criar um ponto com o código ponto = Point(4, 1) não passamos o argumento self.

Criando um ponto.

Como o self é uma referência ao próprio ponto, então não precisamos passar ele quando estamos criando o ponto.

Para entender melhor o que está acontecendo no código que acabamos de testar, veja o teste de mesa abaixo:

Teste de mesa do construtor

Por enquanto, as classes só parecem um jeito muito mais complicado de guardar dados. Vamos começar a adicionar algumas funcionalidades associadas a esses dados.


  1. Um objeto é uma ocorrência/instância de uma classe. No nosso exemplo, é o que é devolvido quando chamamos Point(4, 1)