Module (32%)
Section (22%)

Переменные экземпляра: продолжение

Посмотрите на измененный пример в редакторе.

 

Он почти такой же, как предыдущий. Разница только в именах свойств. Мы добавили два подчеркивания (__) перед ними.

Как Вы знаете, такое дополнение делает переменную экземпляра частной - она становится недоступной из внешнего мира.

Реальное поведение этих имен немного сложнее, поэтому давайте запустим программу. Вот наш вывод:

{'_ExampleClass__first': 1} {'_ExampleClass__first': 2, '_ExampleClass__second': 3} {'_ExampleClass__first': 4, '__third': 5}

output

Вы видите эти странные имена, полные подчеркиваний? Откуда они взялись?

Когда Python видит, что Вы хотите добавить переменную экземпляра к объекту, и Вы собираетесь делать это внутри любого из методов объекта, он манипулирует операцией следующим образом:

  • ставит имя класса перед вашим именем;
  • в начале ставится дополнительный знак подчеркивания.
 

Вот почему __first становится _ExampleClass__first.

Имя теперь полностью доступно за пределами класса. Вы можете запустить такой код:

print(example_object_1._ExampleClass__first)

и Вы получите достоверный результат без ошибок и исключений.

Как Вы можете видеть, ограничения частных переменных в действии.

Манглинг не будет работать, если Вы добавите переменную экземпляра вне кода класса. В этом случае он будет вести себя как любое другое обычное свойство.



Code

class ExampleClass:
def __init__(self, val = 1):
self.__first = val

def set_second(self, val = 2):
self.__second = val


example_object_1 = ExampleClass()
example_object_2 = ExampleClass(2)

example_object_2.set_second(3)

example_object_3 = ExampleClass(4)
example_object_3.__third = 5


print(example_object_1.__dict__)
print(example_object_2.__dict__)
print(example_object_3.__dict__)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×