Boa tarde Paulo, também tive dificuldade em entender isso de início.
A característica de publico e privado é se aquele atributo é modificado internamente pela classe
Veja que no atributo público, você conseguiria alterá-lo pela linha de comando/console. E no caso privado, só chamando a função set_name(). Isso se chama encapsulamento
https://www.alura.com.br/artigos/o-que-e-encapsulamento
Indo um pouco além
Imagina uma função privada que acessa um banco de dados com os dados de um banco, por exemplo saldo.
Essa função faz o controle de exceções e aplica o setter se respeitar as regras de negócio ( ter saldo bancário, ter feito depósito...) e tudo isso dentro de uma classe, de maneira privada.
Então é uma forma de esconder/encapsular as complexidades do seu código em forma de uma função.
Indo mais além 2
Se em uma IDE você tentar rodar classe._name ( isso mesmo, com um único " _ "), você consegue acessar esse atributo "privado", ele até aparece nas sugestôes de autocomplete, é só uma convenção.
Mas se você tiver um atributo com dois " _ ",
>>> classe.__name
esse atributo não aparece como sugestão. Por quê? O interpretador do python altera o nome da variável para não haver conflito com subclasses
https://towardsdatascience.com/whats-the-meaning-of-single-and-double-underscores-in-python-3d27d57d6bd1
Bons estudos!!