В Python существуют соглашения об именовании с одним и двумя подчеркиваниями, которые имеют особое значение, хотя технически не меняют доступ к переменным напрямую.
class MyClass:
def __init__(self):
self._value = 10 # Защищенный атрибут (по соглашению)
Особенности:
obj._value_ не попадают в from module import *class MyClass:
def __init__(self):
self.__value = 20 # Приватный атрибут
Особенности:
_ИмяКласса__valueobj._MyClass__valueclass Test:
def __init__(self):
self.__secret = "password"
t = Test()
print(t.__dict__) # {'_Test__secret': 'password'}
try:
print(t.__secret) # AttributeError
except AttributeError:
print("Доступ запрещен")
print(t._Test__secret) # "password" - но так делать не стоит!
| Характеристика | _value | __value |
|---|---|---|
| Видимость | Соглашение о protected | Name mangling (private-like) |
| Реальное ограничение | Нет | Частичное (через искажение) |
| Наследование | Видно в подклассах | Видно как _Родитель__value |
| Использование | Внутренние вспомогательные | Защита от переопределения |
Имена с двойным подчеркиванием с обеих сторон - это магические методы:
class MyClass:
def __init__(self):
self.__value__ = 30 # Не рекомендуется! Это имя для магических методов
_value - соглашение о защищенном атрибуте (внутреннее использование)__value - name mangling для условно-приватных атрибутов_ - "не используй это снаружи класса"__ - "и тем более не переопределяй это в подклассах"Правильное использование этих соглашений делает код более понятным и помогает избежать случайных ошибок, но не заменяет грамотного проектирования API.