Вы не делаете то, что думаете, что делаете.
Префикс атрибута с двойным подчеркиванием выполняет "искажение имени" . Вы просто присваиваете значение новому атрибуту. Наблюдайте:
class Bank:
def __init__(self, b):
self.__bal = b
def show_bal(self):
print(self.__bal)
А теперь в интерактивном режиме:
>>> b = Bank(23)
>>> b.__bal = 42
>>> b.show_bal()
23
Прежде чем назначить что-либо для b.__bal
, вы также заметите, что доступ к b.__bal
не работает - потому чтоэто еще не существует. Фактическое значение все еще доступно, но его имя «скрыто». Ничто не мешает вам переопределить «личные» атрибуты (концепция, которая на самом деле не существует в Python):
>>> b._Bank__bal = 99
>>> b.show_bal()
99
Если вы хотите защитить атрибут от изменения, лучший способ сделать это - свойства , но даже они будут защищать только открытый интерфейс вашего класса.