"a gente teria que fazer um tratamento para mudar o tamanho."
Sim, exatamente. Pensa que se tamanho fosse um atributo, toda vez que eu adicionasse um novo programa ou excluisse, eu teria que tratar para aumentar/diminuir esse atribute.
Vou apresentar abaixo uma forma diferente de likes para explicar a ideia. Imagine que ao invés de guardar apenas o número de likes, eu tivesse uma lista com os nomes de quem deu o like.
Dessa forma, ao invés de __likes
guardar um valor numérico inteiro, ele guardaria uma lista de strings (nomes de quem deu like).
Se eu quisesse saber quantos likes tem um filme, eu poderia retornar simplesmente o tamanho da lista de likes.
E por que não guardar o tamanho num atributo? Porque cada vez que eu fosse adicionar ou remover um nome da lista, eu teria que tratar também esse atributo, o que é um trabalho desnecessário.
No caso da lista de filmes, ainda temos um outro problema: ela é acessível externamente. Isso significa que alguém pode acessar a lista diretamente por fora e adicionar items na lista. E aí teríamos um problema que teríamos que travar este tipo de comportamente caso a gente quisesse tratar manualmente o atributo tamanho.