Переменные экземпляра: продолжение
Посмотрите на измененный пример в редакторе.
Он почти такой же, как предыдущий. Разница только в именах свойств. Мы добавили два подчеркивания (__
) перед ними.
Как Вы знаете, такое дополнение делает переменную экземпляра частной - она становится недоступной из внешнего мира.
Реальное поведение этих имен немного сложнее, поэтому давайте запустим программу. Вот наш вывод:
{'_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__)