Python не має моделі конфіденційності, не існує модифікаторів доступу, як у C ++, C # або Java. Не існує справді "захищених" або "приватних" атрибутів.
Імена з подвійним нижчим підкресленням і без подвійного підкреслення, що передують, є зіпсованими, щоб захистити їх від зіткнень при спадкуванні. Підкласи можуть визначати свій власний __private()
метод, і вони не заважатимуть одному і тому ж імені батьківського класу. Такі імена вважаються класом приватними ; вони все ще доступні поза класом, але набагато рідше випадково стикаються.
Мангулювання здійснюється шляхом попереднього додавання будь-якого такого імені з додатковим підкресленням та назвою класу (незалежно від того, як ім'я використовується або якщо воно існує), фактично надаючи їм простір імен . У Parent
класі будь-який __private
ідентифікатор замінюється (під час компіляції) на ім'я _Parent__private
, тоді як у Child
класі ідентифікатор замінюється на _Child__private
скрізь у визначенні класу.
Працюватиме наступне:
class Child(Parent):
def foo(self):
self._protected()
def bar(self):
self._Parent__private()
Див. Зарезервовані класи ідентифікаторів у документації лексичного аналізу:
__*
Клас-приватні імена. Імена в цій категорії, коли вони використовуються в контексті визначення класу, переписуються з використанням спотвореної форми, щоб уникнути зіткнень імен між "приватними" атрибутами базового та похідних класів.
та посилання на документацію на імена :
Маніпуляція приватним іменем : Коли ідентифікатор, який текстово зустрічається у визначенні класу, починається з двох або більше символів підкреслення і не закінчується двома або більше символами підкреслення, він вважається приватним ім'ям цього класу. Приватні імена трансформуються у довшу форму до того, як для них буде сформовано код. Трансформація вставляє назву класу з видаленими підкреслювальними знаками та вставляє єдине підкреслення перед іменем. Наприклад, ідентифікатор, __spam
що зустрічається в класі з іменем Ham, буде перетворений на _Ham__spam
. Це перетворення не залежить від синтаксичного контексту, в якому використовується ідентифікатор.
Не використовуйте приватні імена класів, якщо тільки ви спеціально не хочете повідомляти розробникам, які хочуть підкласувати ваш клас, що вони не можуть використовувати певні імена або ризикують зламати ваш клас. Поза опублікованими фреймворками та бібліотеками ця функція мало корисна.
PEP 8 Python Керівництво по стилю це сказати про приватному ім'я перекручуючи:
Якщо ваш клас призначений для підкласу, і у вас є атрибути, які ви не хочете використовувати в підкласах, розгляньте можливість присвоєння їм подвійних підкреслень, що ведуть, і відсутніх підкреслення. Це викликає алгоритм керування іменами Python, де ім'я класу перекручується в ім'я атрибута. Це допомагає уникнути зіткнень імен атрибутів, якщо підкласи ненавмисно містять атрибути з однаковим іменем.
Примітка 1: Зверніть увагу, що в перекрученому імені використовується лише просте ім’я класу, тому, якщо підклас обирає одне і те ж ім’я класу та ім’я атрибута, ви все одно можете отримати зіткнення імен.
Примітка 2: Керування іменами може використовувати певне використання, наприклад, налагодження та
__getattr__()
менш зручне використання. Однак алгоритм керування іменами добре задокументований і простий у виконанні вручну.
Примітка 3: Не всі люблять перекручування імен. Спробуйте збалансувати необхідність уникати випадкових зіткнень імен з потенційним використанням досвідчених абонентів.