Oiii Bruno, como você está?
Essa é uma particularidade da linguagem Python. No Python, por mais que criamos atributos "privados", sempre será possível burlar isso e acessá-los fora da classe sem a utilização dos métodos. Já no Java por exemplo, isso não é possível, não conseguiremos ter acesso a esse atributo diretamente, apenas através de métodos, como os de getter e setter por exemplo, que no Python são chamados de properties.
A título de curiosidade, vou deixar abaixo um exemplo do mesmo código na linguagem Python e na linguagem Java:
Python
class Animal:
def __init__(self, nome):
self._nome = nome
@property
def nome(self):
return self._nome
@nome.setter
def nome(self, novo_nome):
self._nome = novo_nome
cachorro = Animal("Bob")
print(cachorro.nome) # chamando o método de property
print(cachorro._nome) # chamando diretamente o atributo privado, sem utilizar métodos
Java
class Animal {
private String nome;
Animal(String nome) {
this.nome = nome;
}
public String getNome() {
return this.nome;
}
public void setNome(String novoNome) {
this.nome = novoNome;
}
}
class Main {
public static void main(String[] args) {
Animal cachorro = new Animal("Bob");
System.out.println(cachorro.getNome());
System.out.println(cachorro.nome); // Dá erro, não conseguimos acessar o atributo privado diretamente
}
}
Quando pegamos para comparar uma linguagem com a outra, você verá grandes diferenças a respeito de sintaxe e comportamento em relação a algum determinado caso, pois cada linguagem tem sua particularidade. Porém, a base a base permanece a mesma, ou seja, o if que você faz em Python, é o mesmo que você faz em Java, o for, while e assim por diante.
Qualquer dúvida estou por aqui, tá bom?
Grande abraço!