El problema de no "esconder" el estado interno de un objeto es que ya no podés asumir nada en sus métodos. Por ejemplo:
Código Python:
Ver originalclass Ejemplo(object):
def __init__(self):
self.estado = "Inicializado"
def devolver_algo_del_estado(self):
return len(estado)
En un lenguaje como Java, declaras "estado" como "private", y ya te aseguras de que lo anterior no va a fallar en condiciones normales. Sin embargo, en Python, puedo hacer
y ya no puedo asegurar que el método no falle.
Ahora, establecer getters y setters sin hacer ningún control, solamente porque "los atributos públicos son malos" tampoco soluciona el problema (eso sin considerar que en Python no se usa este tipo de métodos, en vez de eso se usan las "properties", lee sobre eso)
Python no tiene atributos privados. Incluso poner un guión bajo frente al nombre no impide que el atributo se modifique, si acaso nada más lo hace un poco más difícil desde el punto de vista de la sintaxis.
Si todos los programadores fuesen "adultos responsables", se usaría solamente la API exportada por una clase para trabajar con sus objetos, es decir sus métodos y atributos públicos. Los atributos privados existen casi únicamente porque en general no se puede confiar en la responsabilidad de los compañeros de trabajo :D