В Python существуют соглашения об именовании с одним и двумя подчеркиваниями, которые имеют особое значение, хотя технически не меняют доступ к переменным напрямую.
class MyClass:
def __init__(self):
self._value = 10 # Защищенный атрибут (по соглашению)
Особенности:
obj._value
_
не попадают в from module import *
class MyClass:
def __init__(self):
self.__value = 20 # Приватный атрибут
Особенности:
_ИмяКласса__value
obj._MyClass__value
class 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.