Python ООП и приватные атрибуты
Ответы (2 шт):
Никак. Приватных атрибутов не существует в 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!
В 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).
