Atributos e métodos
Objetivos da aula
- Consultar e alterar atributos usando métodos.
- Usar parâmetros, condições e valores de retorno.
- Comparar o estado de dois objetos da mesma classe.
Por que isso importa?
Classes podem representar coisas do nosso dia a dia. Uma televisão tem um volume e ações para aumentar ou diminuir esse volume.
Usando métodos para alterar atributos
Na primeira aula, aprendemos que um objeto guarda informações em atributos. Agora, vamos criar métodos que alteram essas informações.
Pense no volume de uma televisão. Podemos aumentar ou diminuir o volume, mas ele precisa ficar entre zero e dez no nosso exemplo.
Exemplo passo a passo: controle de volume
Vamos criar uma televisão que começa com volume cinco:
self.volume = 5define o volume inicial de cada televisão.aumentar_volume()soma um, se o volume ainda estiver abaixo de dez.diminuir_volume()subtrai um, se o volume estiver acima de zero.mostrar_volume()exibe o valor atual.
O que acontece quando chegamos ao limite?
Execute o trecho abaixo depois do código anterior:
O laço tenta aumentar o volume quinze vezes. Mesmo assim, o volume para em dez, pois o if verifica a condição antes de somar.
Cada objeto guarda seus próprios dados
Vamos criar duas televisões e alterar apenas uma delas. Use a mesma classe definida anteriormente:
Os dois objetos usam a mesma classe, mas cada um possui seu próprio atributo volume. Alterar o volume de uma televisão não muda o da outra.
Uma primeira ideia de encapsulamento
Reunir os dados e as ações que trabalham com eles em uma classe faz parte do encapsulamento. Nesta aula, colocamos o volume e os métodos de controle na mesma classe.
O atributo volume ainda pode ser alterado diretamente. Para praticar as regras do exemplo, faça as mudanças pelos métodos aumentar_volume() e diminuir_volume().
Parâmetros e valores de retorno
Vamos retomar a classe Aluno. Execute este exemplo em um novo arquivo. O método adicionar_nota() recebe uma nota; calcular_media() devolve um resultado.
Acessando e alterando atributos
Veja um exemplo usando a classe Aluno definida anteriormente:
O método adicionar_nota() altera a lista do objeto. Já calcular_media() devolve um resultado com return, que pode ser guardado em uma variável. O print() apenas exibe esse resultado na tela.
Se ainda não houver notas, o exemplo retorna zero. Essa verificação evita uma divisão por zero. Em um sistema real, você pode definir outra regra para representar um aluno sem avaliações.
Planejando uma classe antes de programar
Um desenho de classe ajuda a planejar o código antes de programar. Ele mostra o que a classe guarda e o que ela faz. Comece pelo nome da classe, depois liste os atributos e, por fim, os métodos.
+----------------------------+
| Televisao |
+----------------------------+
| volume |
+----------------------------+
| aumentar_volume() |
| diminuir_volume() |
| mostrar_volume() |
+----------------------------+
O desenho informa quais dados e ações existem, mas precisamos descrever o que cada ação faz. No exemplo, combinamos a regra de que o volume fica entre zero e dez. Os métodos implementam essa regra com if.
Erros comuns ao criar atributos e métodos
- Esquecer o
self: use-o como primeiro parâmetro dos métodos de instância e para acessar os atributos do objeto. - Confundir parâmetro com atributo:
nomeé recebido pelo método;self.nomeguarda esse valor no objeto. - Trocar
returnporprint: devolva um resultado comreturnquando ele precisar ser usado em outra parte do programa. - Testar apenas operações aceitas: confira também o volume nos limites e uma média sem notas.
Para aprofundar: atributos de instância e atributos de classe
Atributos criados com self pertencem a cada objeto. Um atributo declarado diretamente no corpo da classe pertence à classe e pode ser consultado por suas instâncias.
O próximo exemplo é independente: execute-o em outro arquivo. Ele usa uma versão reduzida de Aluno, que recebe apenas o nome, para comparar os atributos de classe com os de instância.
__init__. Uma lista declarada no corpo da classe seria compartilhada pelas instâncias que a acessam sem ter um atributo próprio com o mesmo nome.
Resumo rápido
- Atributos de instância guardam o estado de cada objeto.
- Métodos podem consultar e alterar esses dados.
- Parâmetros recebem informações e
returndevolve resultados. - Condições permitem verificar uma regra antes de fazer uma alteração.