Python ООП и приватные атрибуты

Подскажите, пожалуйста, как исправить замечание


Ответы (2 шт):

Автор решения: nomnoms12

Никак. Приватных атрибутов не существует в Python:

“Private” instance variables that cannot be accessed except from inside an object don’t exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.


Замыкания также не позволяют добиться приватности, так как позволяют получить доступ к сохранённым данным через __closure__:

class User:
    def __init__(self, name, password):
        self.name = name
        self._password = password


def get_closure():
    user = User('nomnoms12', '_GrUnDy!')
    def get_public():
        return user.name
    return get_public


get_public = get_closure()        # <function get_closure.<locals>.get_public>
public = get_public()             # nomnoms12

private = get_public.__closure__  # (<cell: User object>,)
user = private[0].cell_contents   # <__main__.User object>
password = user._password         # _GrUnDy!
→ Ссылка
Автор решения: Bol4onok

В Python нет модификаторов доступа, всё является public, но есть определённые соглашения, которые имитируют модификаторы доступа, на простом классе это легче всего показать.

class Example:
    def __init__(self):
        self.public = 'public'
        self._protected = 'protected'
        self.__private = 'private'


obj = Example()
print(obj.public,
      obj._protected,
      obj._Example__private, sep='\n')

Вывод

public
protected
private

Здесь отсутствие подчёркивание сигнализирует о том, что переменная является public. Одно подчёркивание о том, что переменная является protected и к ней не стоит обращаться вне класса-родителя или наследника. А два подчёркивания говорит о private-переменной. Но как можно увидеть, ничто нам не мешает обратиться к этим переменным. Поэтому конкретно в вашем случае скорее всего нужно добавить ещё одно подчёркивание (self.__data).

→ Ссылка