Почему приватный __var может меняться вне класса? (Python 3) - PullRequest
2 голосов
/ 06 октября 2019

У меня есть следующий блок:

class Bank:

    def __init__(self, b):
        self.__bal = b

def main():
    myaccount = Bank(2500)
    myaccount.__bal = 8000
    print(myaccount.__bal)

main()

и отпечатки PyCharm: 8000. Я хочу спросить, как можно изменить частную переменную __bal вне класса?

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

Вы не делаете то, что думаете, что делаете.

Префикс атрибута с двойным подчеркиванием выполняет "искажение имени" . Вы просто присваиваете значение новому атрибуту. Наблюдайте:

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

Если вы хотите защитить атрибут от изменения, лучший способ сделать это - свойства , но даже они будут защищать только открытый интерфейс вашего класса.

0 голосов
/ 06 октября 2019

Позвольте мне рассказать вам одну вещь о Python 3.

Все члены класса Python являются открытыми по умолчанию. Доступ к любому члену возможен вне среды класса.

Следовательно, вы можете вносить изменения в переменную. Для получения дополнительной информации о Python 3 модификаторах доступа к классам, перейдите здесь . Надеюсь, это прояснит ваши сомнения.

...