No Python, não há modificadores de acesso. A convenção é prefixar com um sublinhado os métodos e variáveis que não se espera que sejam acessados de fora da classe. Tecnicamente, isso impede que você acesse esse campo de uma classe de terceiros? De modo nenhum; mas, se o fizer, estará por sua conta e correrá o risco de quebrar alguma coisa, sem poder culpar a outra classe.
No C #, existem modificadores de acesso, mas eles ainda são apenas uma convenção - que é imposta por um compilador, mas ainda é uma convenção. Isso significa que, tecnicamente, ainda é possível acessar e alterar variáveis privadas, através do Reflection ou violando diretamente a memória (como fazem os treinadores de jogos ). A conseqüência é exatamente a mesma: se as variáveis da sua classe forem alteradas através do Reflection de outra classe, ou através da violação de memória de outro aplicativo, e isso interromper algo na sua classe, a culpa não é sua.
Observe que, obviamente, isso cria problemas de segurança nos quais terceiros podem acessar seus dados; algo que leva a variantes criptografadas de uma string e estruturas de dados semelhantes. Mas proteger seu código contra esse uso está relacionado a restrições de acesso ao sistema operacional e ao nível do código , e não tem nada a ver com o Reflection em si.