Bom dia, Marcos! Tudo bem contigo?
Analisando o exemplo da classe Bola que você criou, percebemos que a mesma possui 03 atributos:
- Cor.
- Circunferência.
- Material.
Mediante a definição destes atributos, o uso dos métodos de acesso (anotado com property) e atribuição de valor (anotado com setter) aos atributos pode ser avaliado face à necessidade da sua aplicação.
Por exemplo, caso seu programa precise exibir o valor de algum desses atributos, é interessante adicionar o método de acesso (anotado com property) pelos seguintes motivos (dentre outros):
- É uma boa prática.
- É uma convenção da linguagem.
O mesmo valore para o método de atribuição de valor (anotado com setter). Imagine por exemplo que seja possível alterar a circunferência da bola e, quando o usuário repassar o novo valor da circunferência, você queira validar se:
- O valor é maior do que 0.
- O novo valor é diferente do anterior/atual.
-Desta forma, estas validações poderiam ser feitas neste método.
Em suma, apesar de o Python não impedir o acesso e atribuição de valor aos atributos sem o uso destes métodos - como é o caso do Java, por exemplo, que possui maior rigidez quanto à implementação dos métodos getters e setters -, é interessante implementá-los quando uma das necessidades acima se manifestar.
Espero ter contribuído um pouquinho com seu aprendizado.
Abraço e bons estudos!